Python 我怎样才能把熊猫群居者的群体组合起来呢?

Python 我怎样才能把熊猫群居者的群体组合起来呢?,python,pandas,dataframe,Python,Pandas,Dataframe,我使用DataFrame.groupby()对具有相同键的行进行分组,同时保持先前排序的行顺序。我希望将这些组重新组合成一个完整的数据帧,这样具有公共键的行将紧跟在第一个这样的行之后,组将首先以最大的col值开始。经过大量的实验和搜索splitapplycombine以获得一个单独的合并方法,我得出了下面的习惯用法。它需要一个开放编码的标识函数,这向我暗示了我并没有按预期的方式使用GroupBy。有更好的成语吗 df.sort_values(col, ascending=False).group

我使用DataFrame.groupby()对具有相同键的行进行分组,同时保持先前排序的行顺序。我希望将这些组重新组合成一个完整的数据帧,这样具有公共键的行将紧跟在第一个这样的行之后,组将首先以最大的col值开始。经过大量的实验和搜索splitapplycombine以获得一个单独的合并方法,我得出了下面的习惯用法。它需要一个开放编码的标识函数,这向我暗示了我并没有按预期的方式使用GroupBy。有更好的成语吗

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

我很想知道我在什么地方可以自己回答这个问题。

我们可以先
排序
。因为
pd.unique
保留顺序,它会找到按其最高值排序的
'key'
。然后,通过设置索引并使用
.loc
我们可以将所有这些项组合在一起

样本数据 代码
另一种方法是创建一个helper列。您希望按组中的max
'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)])
然而,因为您只需要重新安排整个数据,所以实际上没有必要拆分它,只需将所有内容合并回来。
.groups
属性存储索引。将它们链接在一起并分割原始数据帧

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

df = df.loc[idx]

我们可以先排序。因为
pd.unique
保留顺序,它会找到按其最高值排序的
'key'
。然后,通过设置索引并使用
.loc
我们可以将所有这些项组合在一起

样本数据 代码
另一种方法是创建一个helper列。您希望按组中的max
'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)])
然而,因为您只需要重新安排整个数据,所以实际上没有必要拆分它,只需将所有内容合并回来。
.groups
属性存储索引。将它们链接在一起并分割原始数据帧

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

df = df.loc[idx]

请将数据样本与预期输出一起显示
df的错误。
排序值(['key',col'],升序=False)
?使用df.sort_值(['key',col',…)将首先放置具有最高键的行。我首先需要具有最高列的行,以及任何其他相同的键行。我不明白这在逻辑上是怎么可能的。您可以先按
排序,也可以先按
排序。你不能同时拥有两者。也许我误解了什么。您能给出一个输出的示例表吗?IIUC,他们想按组排序,其中键是组内最高的
'col'
值,然后按
'col'
在组内排序。这不能通过简单的排序来完成,因为
sort\u值
不能接受函数。但是您可以使用
groupby+transform
创建帮助器列。请将
df.sort_值(['key',col',,升序=False)的错误显示为数据样本以及预期输出。
?使用df.sort_值(['key',col',])将首先放置具有最高键的行。我首先需要具有最高列的行,以及任何其他相同的键行。我不明白这在逻辑上是怎么可能的。您可以先按
排序,也可以先按
排序。你不能同时拥有两者。也许我误解了什么。您能给出一个输出的示例表吗?IIUC,他们想按组排序,其中键是组内最高的
'col'
值,然后按
'col'
在组内排序。这不能通过简单的排序来完成,因为
sort\u值
不能接受函数。但是您可以使用
groupby+transform