pandas 如何添加交叉行作为排序/分组的结果?

n3h0vuf2  于 2023-01-11  发布在  其他
关注(0)|答案(3)|浏览(102)

我有以下示例输入数据:

import pandas as pd
df = pd.DataFrame({'col1': ['x', 'y', 'z'], 'col2': [1, 2, 3], 'col3': ['a', 'a', 'b']})

我想按col3进行排序和分组,同时在col1中相应组的顶部交叉汇总,并获得以下输出:

col1  col2
0     a      3
1     x      1
2     y      2
3     b      3
4     z      3

我当然可以做的一部分:

df.sort_values(by=['col3']).groupby(by=['col3']).sum()

      col2
col3      
  a      3
  b      3

但是我不确定如何在col1上交错组标签。

pxy2qtax

pxy2qtax1#

对每个组的top1行使用自定义函数:

def f(x):
    return pd.DataFrame({'col1': x.name, 'col2': x['col2'].sum()}, index=[0]).append(x)
    
df = (df.sort_values(by=['col3'])
        .groupby(by=['col3'], group_keys=False)
        .apply(f)
        .drop('col3', 1)
        .reset_index(drop=True))
print (df)
  col1  col2
0    a     3
1    x     1
2    y     2
3    b     3
4    z     3

性能更高的解决方案是使用GroupBy.ngroup作为索引,按concat聚合sum和最后一个连接值,仅按mergesort进行稳定排序:

df = df.sort_values(by=['col3'])

df1 = df.groupby(by=['col3'])['col2'].sum().rename_axis('col1').reset_index()
df2 = df.set_index(df.groupby(by=['col3']).ngroup())

df = pd.concat([df1, df2]).sort_index(kind='mergesort', ignore_index=True).drop('col3', 1)
print (df)
  col1  col2
0    a     3
1    x     1
2    y     2
3    b     3
4    z     3
91zkwejq

91zkwejq2#

关于:

(df.melt(id_vars='col2')
   .rename(columns={'value': 'col1'})
   .groupby('col1').sum()
   .reset_index()
)

输出:

col1  col2
0    a     3
1    b     3
2    x     1
3    y     2
4    z     3
olhwl3o2

olhwl3o23#

def function1(dd:pd.DataFrame):
    df.loc[dd.index.min()-0.5,['col1','col2']]=[dd.name,dd.col2.sum()]

df.groupby('col3').apply(function1).pipe(lambda dd:df.sort_index(ignore_index=True)).drop('col3',axis=1)

输出

col1  col2
0    a     3
1    x     1
2    y     2
3    b     3
4    z     3

或使用pandasql库

def function1(dd:pd.DataFrame):
    return dd.sql("select '{}' as col1,{} as col2 union select col1,col2 from self".format(dd.name,dd.col2.sum()))

df.groupby('col3').apply(function1).reset_index(drop=False)

      col1  col2
    0    a     3
    1    x     1
    2    y     2
    3    b     3
    4    z     3

相关问题