如何在 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