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”之前出现,我在解决方案之前添加了Adf.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