【问题标题】:How to pass multiple interrelated columns to the function on groupby and agg?如何将多个相互关联的列传递给 groupby 和 agg 上的函数?
【发布时间】:2019-11-27 04:55:22
【问题描述】:

我有以下 pandas DataFrame df

id  col1   col2
1   7      1.2
1   6      0.8
1   12     0.9
1   1      1.1
2   3      2.0
2   6      1.8
3   10     0.7
3   11     0.9
3   12     1.2

这里是创建这个df的代码:

import pandas as pd
df = pd.DataFrame({'id': [1,1,1,1,2,2,3,3,3], 
                   'col1': [7,6,12,1,3,6,10,11,12],
                   'col2': [1.2,0.8,0.9,1.1,2.0,1.8,0.7,0.9,1.2]})

我需要按id 分组并将myfunc 函数应用于每个组。问题是myfunc 需要几个相互关联的列作为输入。最终目标是为每个id 创建一个新列new_col

我该怎么做?

这是我当前的代码:

def myfunc(df, col1, col2):

    df1 = col1
    df2 = df[df[col2] < 1][[col1]]
    var1 = df1.iloc[0]
    var2 = df2.iloc[0][0]

    result = var2 - var1

    return result


df["new_col"] = df.groupby("id").agg(myfunc(...??))

【问题讨论】:

  • 也许您在寻找apply(而不是agg)?
  • @AlexandreB.: 该函数应该将col1 的第一个值作为var1 并将col1 的第一个值通过col2 上的条件作为var2。然后我应该计算var1var2 之间的差异。查看更新。

标签: python pandas


【解决方案1】:

在 groupby-apply 中,my_func() 被传递给整个组,包括所有列。您可以简单地从该组中选择列:

def myfunc(g):
    var1 = g['col1'].iloc[0]
    var2 = g.loc[g['col2'] > 1, 'col1'].iloc[0]

    return var1 / var2

df['new_col'] = df.groupby("id").apply(myfunc)

【讨论】:

  • 我可以这样做吗?:df[['new_col1','new_col2']] = df.groupby("id").apply(myfunc1,myfunc2)
  • Yes,但请留在此处。
猜你喜欢
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2013-11-22
  • 2013-07-08
  • 2020-12-05
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多