如果列表中的索引,熊猫按功能分组以执行不同的方法
Posted
技术标签:
【中文标题】如果列表中的索引,熊猫按功能分组以执行不同的方法【英文标题】:Pandas group by function to do different methods if index in list 【发布时间】:2021-11-17 12:02:29 【问题描述】:我想知道是否可以创建自己的 groupby 函数,根据索引是否在某个列表中,在单个列中为输出运行不同的方法。例如:
df = pd.DataFrame('ID' : [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'Data' : [5, 7, 6, 13, 14, 11, 10, 2, 4, 3])
some_list = [2, 3]
我想按 ID 列分组,并返回 Data 列的平均值(df.groupby('ID').mean()
对于大多数值)但是,如果 ID 在 some_list
中,那么我希望将平均值计算为 Data 的总和除以 4 (df.groupby('ID').sum()/4
)。上面的输出如下所示:
ID Data
0 1 6.00
1 2 12.00
2 3 2.25
我知道我可以分别执行这两种方法并在执行 groupby 后加入一列,但我想知道是否可以一步完成?也许是df.groupby('ID').apply(function)
?
我查看了this question,但没有帮助。
【问题讨论】:
【参考方案1】:尝试groupby
和apply
和一个条件:
df.groupby('ID', as_index=False)['Data'].apply(lambda x: x.sum() / 4 if x.name in some_list else x.mean())
输出:
ID Data
0 1 6.00
1 2 12.00
2 3 2.25
【讨论】:
这个方法完全符合我的需要,但我刚刚使用 pylint 分析了我的代码,它给出了一个警告:W0640 (cell-var-from-loop): Cell variable defined in loop
。我不知道这是否只是因为它在我的代码中的位置(我在 for 循环中使用它)。
@EmiOB 那肯定不是我的代码,肯定是你的其他代码,pandas 有不同的警告。
刚刚测试过,不是你的代码,我显然搞砸了
@EmiOB 酷!希望你能解决它
@EmiOB 你可以在谷歌上搜索如何禁用警告:)【参考方案2】:
如果性能很重要,不要使用groupby.apply
,您可以过滤聚合行sum
和聚合mean
:
s = df[df['ID'].isin(some_list)].groupby('ID')['Data'].sum().div(4)
df = s.combine_first(df.groupby('ID')['Data'].mean()).reset_index()
print (df)
ID Data
0 1 6.00
1 2 12.00
2 3 2.25
这是替代解决方案:
df = df.groupby('ID')['Data'].agg(['sum','mean']).reset_index()
df['Value'] = np.where(df['ID'].isin(some_list), df.pop('sum').div(4), df.pop('mean'))
print (df)
ID Value
0 1 6.00
1 2 12.00
2 3 2.25
【讨论】:
以上是关于如果列表中的索引,熊猫按功能分组以执行不同的方法的主要内容,如果未能解决你的问题,请参考以下文章