我使用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的什么地方我可以自己回答这个问题。
发布于 2020-03-31 10:01:46
我们可以先使用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做你想做的另一种方式是创建一个helper列。您希望按组内的最大'col'值进行排序,因此使用transform将结果广播到一个帮助器列,我们对该列进行排序,然后删除该列。
df['key1'] = df.groupby('key')['col'].transform('max')
df = df.sort_values(['key1', 'col'], ascending=False).drop(columns='key1')如果您想使用groupby,那么您实际上只是使用它来获取索引位置。一种直接的实现方式是只遍历concat对象,对组进行遍历:
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]https://stackoverflow.com/questions/60942199
复制相似问题