我正在使用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中我本人可以回答这个问题。
答案 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]