如果列表中的索引,熊猫按功能分组以执行不同的方法

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】:

尝试groupbyapply 和一个条件:

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

【讨论】:

以上是关于如果列表中的索引,熊猫按功能分组以执行不同的方法的主要内容,如果未能解决你的问题,请参考以下文章

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

根据熊猫数据框中的列标签对数据进行分组

无法获取数据,使用包 yfinance 按格式分组下载到熊猫数据框中,仅适用于我的子列表中的特定代码

如何按索引级别和值对分组的多索引熊猫系列进行排序?

如果日期时间索引的差异小于熊猫系列的 5 分钟,则分组

如何在熊猫中按对象分组应用滚动功能