对pandas groupby中的列子集应用函数

2024-04-23 23:06:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含许多列的df。我想按idtransform这些列的一个子集进行分组,其余部分保持不变。最好的方法是什么?特别是,我有一个包含一堆id的df,我希望在每个id中z-score列a和{}。列c应该保持不变。在我的实际问题中,我有更多的专栏。在

我能想到的最好的方法是将{col_name: function_name}dict传递给transform。出于某种原因,这会引发TypeError。在

MWE:

import pandas as pd
import numpy as np
np.random.seed(123) #reproducible ex
df = pd.DataFrame(data = {"a": np.arange(10), "b": np.arange(10)[::-1], "c": np.random.choice(a = np.arange(10), size = 10)}, index = pd.Index(data = np.random.choice(a = [1,2,3], size = 10), name = "id"))

#create a dict for all columns other than "c" and the function to do the transform
fmap = {k: lambda x: (x - x.mean()) / x.std() for k in df.columns if k != "c"}
df.groupby("id").transform(fmap) #yields error that "dict" is unhashable

原来这是一个已知的错误:https://github.com/pandas-dev/pandas/issues/17309


Tags: 方法nameimportidpandasdfdataas
1条回答
网友
1楼 · 发布于 2024-04-23 23:06:37

一种可能的解决方案是先按difference过滤列名称,因为dict还不能处理transfrom

cols = df.columns.difference(['c'])
print (cols)
Index(['a', 'b'], dtype='object')

fmap = lambda x: (x - x.mean()) / x.std()
df[cols] = df.groupby("id")[cols].transform(fmap) 
print (df)
           a         b  c
id                       
3  -1.000000  1.000000  2
2  -1.091089  1.091089  2
1  -1.134975  1.134975  6
3   0.000000  0.000000  1
1  -0.529655  0.529655  3
2   0.218218 -0.218218  9
3   1.000000 -1.000000  6
2   0.872872 -0.872872  1
1   0.680985 -0.680985  0
1   0.983645 -0.983645  1

相关问题 更多 >