【问题标题】:apply function to all columns in pandas groupby dataframe将函数应用于熊猫 groupby 数据框中的所有列
【发布时间】:2021-07-22 14:41:09
【问题描述】:

我有以下数据框(我们称之为data):

id | type | val1 | val2 |
-------------------------
1  |  A   | 10.1 | 11.0 |
1  |  B   | 10.5 | 11.2 |
2  |  A   | 10.7 | 10.9 |
2  |  B   | 10.6 | 11.1 |
3  |  A   | 10.3 | 10.5 |
3  |  B   | 10.4 | 11.3 |

并且我想为每个id 获取每个valX 列的AB (A-B) 类型之间的差异,即我希望结果是:

id | val1 | val2 |
------------------
1  | -0.4 | -0.2 |
2  |  0.1 | -0.2 |
3  | -0.1 | -0.8 |

我能做到这一点的唯一方法是定义一个函数:

def getDelta(df, valName):
    return df[ df['type']=='A' ][valName].values[0] - df[ df['type']=='B' ][valName].values[0]

并将其分别应用于每一列:

data.groupby('id').apply(getDelta,valName='val1')

然后合并结果得到我要找的东西。

有没有更有效的方法来做到这一点?最后,我想将一个函数应用于分组数据框的列的子集,但该函数必须考虑另一列的值。

【问题讨论】:

  • 是否总是ABid?会有重复的As 或Bs 吗?

标签: python pandas dataframe pandas-groupby apply


【解决方案1】:

目前你可以使用np.subtract.reduce,假设在所有情况下'A'都在'B'之前,并且没有重复:

df.groupby("id", sort = False).agg(np.subtract.reduce).reset_index()

   id  val1  val2
0   1  -0.4  -0.2
1   2   0.1  -0.2
2   3  -0.1  -0.8

【讨论】:

  • 为了确保“A”总是出现在“B”之前,我在您的解决方案之前添加了df.sort_values(by=['id','type'])。非常感谢!
【解决方案2】:

您可以groupby() 您的 ID 列并在您的 valX 列上使用 diff(-1)。将操作包裹在concat() 中,你会给你想要的结果吗?

df.set_index('id',inplace=True)
pd.concat([df.groupby(['id'])[df.filter(like='val').columns.tolist()].diff(-1).dropna()]).reset_index()

   id  val1  val2  val3
0   1  -0.4  -0.2  -3.1
1   2   0.1  -0.2  17.0
2   3  -0.1  -0.8   1.5

我添加了一个额外的 valX 仅用于说明目的。

【讨论】:

  • 谢谢!我不知道diff(-1),它确实很有用。尽管如此,我已经在使用pd.concat(...) 并且是我想要避免的部分之一:)
  • 欢迎您!很高兴你的问题得到了回答。确实,我认为 sammywemmy 的方法也应该采用。
【解决方案3】:

您可以旋转数据框:

x = df.pivot(index="id", columns="type", values="val1")
y = df.pivot(index="id", columns="type", values="val2")

df = pd.concat([x["A"] - x["B"], y["A"] - y["B"]], axis=1).rename(
    columns={0: "val1", 1: "val2"}
)
print(df)

打印:

    val1  val2
id            
1   -0.4  -0.2
2    0.1  -0.2
3   -0.1  -0.8

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2019-02-07
    • 2018-11-13
    • 1970-01-01
    • 2018-07-22
    • 2021-02-12
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多