如何在 python 中使用 group by 融化列
how to melt the column with group by in python
我有 4 列的数据。我想用 melt 进行 group by。
data:
col1 col2 col3 col4
de1 do1 2020-11-24 vt1
de1 do1 2020-11-24 vt2
de1 do2 2020-11-24 vt1
de1 do2 2020-11-24 vt2
我想得到如下输出:
col1 col2 col3 vt1 vt2
de1 do1 2020-11-24 1 1
de1 do2 2020-11-24 1 1
我试过这样
df1 = data.melt('col1','col2','col3').groupby(['col1','col2','col3','col4']).size().unstack(fill_value=0)
我正在等待key error: 'col1'
我试过 melt(['col1','col2','col3')]
。我收到错误 key error: 'col4'
.
请帮我解决这个问题。
它能解决您的问题吗?
aux = df.melt(id_vars=['col1','col2', 'col3'], value_vars=['val'])
aux['count'] = 1
aux.pivot(index = ['col1','col2','col3'], columns='value',values='count' )
做一个 pivot_table 会不会更容易?
import pandas as pd
data={'col1':['de1','de1','de1','de1'],
'col2':['do1','do1','do2','do2'],
'col3':['2020-11-24','2020-11-24','2020-11-24','2020-11-24'],
'col4':['vt1','vt2','vt1','vt2']}
df=pd.DataFrame(data)
pivot=pd.pivot_table(df,index=['col1','col2','col3'], columns=['col4'],
aggfunc=len, fill_value=0).reset_index()
print(pivot)
结果:
col1 col2 col3 vt1 vt2
0 de1 do1 2020-11-24 1 1
1 de1 do2 2020-11-24 1 1
对正在发生的事情的解释
首先,您的 table 将具有 index
Col1 到 3,然后 Col4 将用于将其值转换为新列,aggfunc
将提供 count
对于每个值(从 col4 中提取)。 Missing values
将收到 0,最后的 reset_index
是为了给 table 一个更好的形状(not needed
)。
此解决方案 returns 列的名称也是正确的:
df = pd.DataFrame({
"col1": ["de1", "de1", "de1", "de1"],
"col2": ["do1", "do1", "do2", "do2"],
"col3": ["2020-11-24", "2020-11-24", "2020-11-24", "2020-11-24"],
"col4": ["vt1", "vt2", "vt1", "vt2"]
})
df['count'] = 1
group_df = df.groupby(['col1','col2','col3','col4']).count().unstack(fill_value=0).reset_index(level=[0,1,2])
group_df.columns = list(group_df.columns.get_level_values(0))[:3] + list(group_df.columns.get_level_values(1))[3:]
输出:
col1 col2 col3 vt1 vt2
0 de1 do1 2020-11-24 1 1
1 de1 do2 2020-11-24 1 1
我有 4 列的数据。我想用 melt 进行 group by。
data:
col1 col2 col3 col4
de1 do1 2020-11-24 vt1
de1 do1 2020-11-24 vt2
de1 do2 2020-11-24 vt1
de1 do2 2020-11-24 vt2
我想得到如下输出:
col1 col2 col3 vt1 vt2
de1 do1 2020-11-24 1 1
de1 do2 2020-11-24 1 1
我试过这样
df1 = data.melt('col1','col2','col3').groupby(['col1','col2','col3','col4']).size().unstack(fill_value=0)
我正在等待key error: 'col1'
我试过 melt(['col1','col2','col3')]
。我收到错误 key error: 'col4'
.
请帮我解决这个问题。
它能解决您的问题吗?
aux = df.melt(id_vars=['col1','col2', 'col3'], value_vars=['val'])
aux['count'] = 1
aux.pivot(index = ['col1','col2','col3'], columns='value',values='count' )
做一个 pivot_table 会不会更容易?
import pandas as pd
data={'col1':['de1','de1','de1','de1'],
'col2':['do1','do1','do2','do2'],
'col3':['2020-11-24','2020-11-24','2020-11-24','2020-11-24'],
'col4':['vt1','vt2','vt1','vt2']}
df=pd.DataFrame(data)
pivot=pd.pivot_table(df,index=['col1','col2','col3'], columns=['col4'],
aggfunc=len, fill_value=0).reset_index()
print(pivot)
结果:
col1 col2 col3 vt1 vt2
0 de1 do1 2020-11-24 1 1
1 de1 do2 2020-11-24 1 1
对正在发生的事情的解释
首先,您的 table 将具有 index
Col1 到 3,然后 Col4 将用于将其值转换为新列,aggfunc
将提供 count
对于每个值(从 col4 中提取)。 Missing values
将收到 0,最后的 reset_index
是为了给 table 一个更好的形状(not needed
)。
此解决方案 returns 列的名称也是正确的:
df = pd.DataFrame({
"col1": ["de1", "de1", "de1", "de1"],
"col2": ["do1", "do1", "do2", "do2"],
"col3": ["2020-11-24", "2020-11-24", "2020-11-24", "2020-11-24"],
"col4": ["vt1", "vt2", "vt1", "vt2"]
})
df['count'] = 1
group_df = df.groupby(['col1','col2','col3','col4']).count().unstack(fill_value=0).reset_index(level=[0,1,2])
group_df.columns = list(group_df.columns.get_level_values(0))[:3] + list(group_df.columns.get_level_values(1))[3:]
输出:
col1 col2 col3 vt1 vt2
0 de1 do1 2020-11-24 1 1
1 de1 do2 2020-11-24 1 1