python - Groupby 应用自定义函数 Pandas

标签 python pandas dplyr

我正在尝试在 pandas 中应用自定义函数,类似于 dplyr 中的 groupby 和 mutate 功能。

我想做的是给定一个像这样的 pandas 数据框:

df = pd.DataFrame({'category1':['a','a','a', 'b', 'b','b'],
  'category2':['a', 'b', 'a', 'b', 'a', 'b'],
  'var1':np.random.randint(0,100,6),
  'var2':np.random.randint(0,100,6)}
)

df
  category1 category2  var1  var2
0         a         a    23    59
1         a         b    54    20
2         a         a    48    62
3         b         b    45    76
4         b         a    60    26
5         b         b    13    70

应用一些返回与组中元素数相同的元素数的函数:

def myfunc(s):
  return [np.mean(s)] * len(s)

得到这个结果

df
  category1 category2  var1  var2   var3
0         a         a    23    59   35.5
1         a         b    54    20   54
2         a         a    48    62   35.5
3         b         b    45    76   29
4         b         a    60    26   60
5         b         b    13    70   29

我在想一些类似的事情:

df['var3'] = df.groupby(['category1', 'category2'], group_keys=False).apply(lambda x: myfunc(x.var1))

但未能获得匹配的索引。

在带有 dplyr 的 R 中,这将是

df <- df %>%
  group_by(category1, category2) %>%
  mutate(
    var3 = myfunc(var1)
  )

所以我能够通过使用像这样的自定义函数来解决它:

def myfunc_data(data):

  data['var3'] = myfunc(data.var1)
  return data

df = df.groupby(['category1', 'category2']).apply(myfunc_data)

但我想我仍然想知道是否有一种方法可以在不定义此自定义函数的情况下做到这一点。

最佳答案

使用GroupBy.transform返回与原始 DataFrame 大小相同的 Series,因此可以分配给新列:

np.random.seed(123)

df = pd.DataFrame({'category1':['a','a','a', 'b', 'b','b'],
  'category2':['a', 'b', 'a', 'b', 'a', 'b'],
  'var1':np.random.randint(0,100,6),
  'var2':np.random.randint(0,100,6)}
)

df['var3'] = df.groupby(['category1', 'category2'])['var1'].transform(myfunc)
print (df)
  category1 category2  var1  var2  var3
0         a         a    66    86    82
1         a         b    92    97    92
2         a         a    98    96    82
3         b         b    17    47    37
4         b         a    83    73    83
5         b         b    57    32    37

使用 lambda 函数 的替代方法:

df['var3'] = (df.groupby(['category1', 'category2'])['var1']
                .transform(lambda s: [np.mean(s)] * len(s)))

关于python - Groupby 应用自定义函数 Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55644578/

相关文章:

python - 在 Python 中拆分元组 - 最佳实践?

python - 字符串操作像python中的多个字母

python - Pandas 数据系列 - 如何解决天数差异

r - 根据前一行中多个变量的值对行进行条件过滤

r - R 中的条件交叉表

r - "Unnest"时间间隔重叠

Python Mixin - 未解析的属性引用 [PyCharm]

python - 如何将 Pandas 数据透视表转换为数据框

Pandas 按周分组

python - 读取 CSV 转置 Pandas