【问题标题】:Apply multiple custom functions to multiple columns on multiple groupby objects in Pandas in Python将多个自定义函数应用于 Python 中 Pandas 中多个 groupby 对象的多个列
【发布时间】:2021-04-18 16:53:22
【问题描述】:

我有以下数据框、groupby 对象和函数。

df = pd.DataFrame({
    'A': 'a a b b b'.split(), 
    'P': 'p p p q q'.split(), 
    'B': [1, 2, 3, 4, 5], 
    'C': [4, 6, 5, 7, 8],
    'D': [9, 10, 11, 12, 13]})

g1 = df.groupby('A')

g2 = df.groupby('P')

def f1(x, y):
    return sum(x) + sum(y)

def f2(x, y):
    return sum(x) - sum(y)

def f3(x, y):
    return x * y

对于g1,我想

  • 将 f1 应用于 B 列和 C 列
  • 将 f2 应用于 C 和 D 列。

对于g2,我想

  • 将 f2 应用于 B 列和 C 列
  • 将 f3 应用于 C 和 D 列

对我来说,困难在于函数,它们在多个列上运行。我还需要这些函数适用于任意一组列;注意 f2 如何用于 ['B', 'C'] 和 ['C', 'D']。我正在为处理这个问题的语法而苦苦挣扎。

如何使用 Pandas 在 Python 中完成所有这些事情?

【问题讨论】:

  • 你能分享你的预期输出吗?
  • 这是一个很好的例子,说明如何提供有用的测试数据。人们经常做诸如“这是从我的硬盘驱动器加载 CSV 的一些代码”之类的事情,而试图回答问题的人无法测试他们提出的代码。
  • @AmitVikramSingh 不,它没有。我的功能涉及任何 2 个可能的列之间的操作。该线程使用的函数一次只涉及一列。
  • @Iterator516 如果您在@TedPetrou 的答案中搜索部分Using apply and returning a Series,他正在使用多个列。

标签: python pandas function group-by pandas-groupby


【解决方案1】:

我不知道是否有更简单的方法可以做到这一点,但一种方法是使用柯里化。我找不到使用 groupby 结构添加列的方法(所涉及的结构是围绕非可变数据设计的),所以我只是直接处理 groupby 对象中的数据。您可以查看以下代码是否符合您的要求:

def sum_curry(x, y):
    return lambda df: sum(df[x]) + sum(df[y])

def diff_curry(x, y):
    return lambda df: sum(df[x]) - sum(df[y])

def append_prod(df):
    df['E'] = df['C']*df['D']
    return df
   
g1_sums = g1.apply(sum_curry('B','C'))
g1_diffs = g1.apply(diff_curry('C','D'))
g2_diffs = g2.apply(diff_curry('B','C'))
g2_with_prod = [(group[0], append_prod(group[1])) for group in g2]

【讨论】:

  • 感谢您的详细回复,但 g2_with_prod 与我的预期不同。我编辑了我的问题以包括我上面的预期输出。我们分歧的根源是什么?
  • @Iterator516 在您的“所需输出”屏幕截图中,您的 D 有 30 和 25,但我在您使用的示例数据中没有看到这些数字。
  • 我是这样得出这些数字的:对于 G2,我按“P”列分组,所以我将前 3 个数字添加为“p”,后两个数字添加为“问”。 9 + 10 + 11 = 30。12 + 13 = 25。
  • @Iterator516 在 Pandas 中,groupby 创建一个用于聚合的对象。它不是聚合本身。如果你想按总和聚合,你必须告诉 Pandas。听起来像aggregated_df = df.groupby('P').sum() 然后aggregated_df['E'] = aggregated_df['C']*aggregated_df['D'] 得到你想要的。
  • @Accumulation 啊-好的。感谢您纠正我的理解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多