1

我正在使用 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 文档中我可以自己回答这个问题的地方。

4

1 回答 1

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]
于 2020-03-31T02:01:45.980 回答