Python 将函数应用于groupby数据帧中的所有列

Python 将函数应用于groupby数据帧中的所有列,python,pandas,dataframe,pandas-groupby,apply,Python,Pandas,Dataframe,Pandas Groupby,Apply,我有以下数据帧(我们称之为data): 我想获得每个id的A和B(A-B)类型之间的差异,即,我希望结果是: id | val1 | val2 | ------------------ 1 | -0.4 | -0.2 | 2 | 0.1 | -0.2 | 3 | -0.1 | -0.8 | 完成此操作的唯一方法是定义一个函数: def getDelta(df,valName): 返回df[df['type']=='A'][valName]。值[0]-df[df['type']=='B'

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

我想获得每个
id
A
B
A
-
B
)类型之间的差异,即,我希望结果是:

id | val1 | val2 |
------------------
1  | -0.4 | -0.2 |
2  |  0.1 | -0.2 |
3  | -0.1 | -0.8 |
完成此操作的唯一方法是定义一个函数:

def getDelta(df,valName):
返回df[df['type']=='A'][valName]。值[0]-df[df['type']=='B'][valName]。值[0]
并将其分别应用于每列:

data.groupby('id').apply(getDelta,valName='val1')
然后合并结果以获得我想要的结果


有没有更有效的方法?最后,我想将一个函数应用于分组数据框的一部分列,但此函数必须考虑另一列的值。

您可以旋转数据框:

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
身份证件
1   -0.4  -0.2
2    0.1  -0.2
3   -0.1  -0.8
您可以
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()


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

按照目前的情况,您可以使用
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

根据
id
,是否总是
A
B
?是否会有重复的
A
s或
B
s?谢谢!我不知道
diff(-1)
,它确实很有用。尽管如此,我已经在使用pd.concat(…),这是我想要避免的部分之一:)欢迎!很高兴你的问题得到了回答。事实上,在我看来,sammywemmy的方法也是可行的。为了确保“A”总是在“B”之前出现,我在解决方案之前添加了A
df.sort_值(by=['id','type'])
。谢谢!
   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
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