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