如何将熊猫GroupBy的组组合在一起?

时间:2020-03-31 01:46:37

标签: python pandas dataframe

我正在使用DataFrame.groupby()将具有相同键的行分组,同时保持先前排序的行顺序。我希望将这些组重新组合成一个完整的DataFrame,因此具有公共关键字的行将在此类行的第一行之后,而组的首行是从最大col值开始。经过大量的实验,并在split-apply-combine中搜索了单独的合并方法,我得出了以下可行的成语。它需要一个开放的编码身份功能,这向我暗示我没有按预期的方式使用GroupBy。有更好的成语吗?

df.sort_values(col, ascending=False).groupby(key, sort=False).apply(lambda g_df: g_df)

我很想知道在pandas documentation中我本人可以回答这个问题。

1 个答案:

答案 0 :(得分:0)

我们可以先sort。由于pd.unique个保留者顺序,因此它会按其最高值来查找'key'。然后,通过设置索引并使用.loc,我们可以将它们全部分组在一起。

样本数据

import pandas as pd
df = pd.DataFrame({'col': [1,2,3,4,5,6,7,8,9,10],
                   'key': list('abababcacb')})

代码

df = df.sort_values('col', ascending=False)
df = df.set_index('key').loc[df['key'].unique()].reset_index()

  key  col
0   b   10
1   b    6
2   b    4
3   b    2
4   c    9
5   c    7
6   a    8
7   a    5
8   a    3
9   a    1

执行所需操作的另一种方法是创建一个帮助器列。您要按组中的最大'col'值进行排序,因此请使用transform将结果广播到我们进行排序然后放下的帮助器列。

df['key1'] = df.groupby('key')['col'].transform('max')
df = df.sort_values(['key1', 'col'], ascending=False).drop(columns='key1')

如果您想使用groupby,则实际上只是在使用它来获取索引位置。直接实现是仅concat个组,遍历groupby对象:

df = pd.concat([gp for _,gp in df.sort_values('col', ascending=False).groupby('key', sort=False)])

但是,因为您只需要重新排列整个DataFranme,所以实际上不必为了将所有内容重新组合而将其拆分。 .groups属性存储索引。将它们链接在一起并切片原始DataFrame

from itertools import chain
idx = chain.from_iterable(df.sort_values('col', ascending=False)
                            .groupby('key', sort=False)
                            .groups.values())

df = df.loc[idx]