我在pandas中有一个数据框,其中包含我想要分组的信息。从每个组中,我想从该组中的整个列中减去某个列的第一个值。然后应将这些值作为附加列添加到数据框中。 我的初始数据框的一个例子:
time sample x y mass
3 1.0 216 12 12
4 1.0 218 13 12
5 1.0 217 12 12
6 1.0 234 13 13
1 2.0 361 289 23
2 2.0 362 287 22
3 2.0 362 286 22
5 3.0 124 56 18
6 3.0 126 52 17
我希望得到的结果是:
sample time x y mass xdiff
1.0 3 216 12 12 0
1.0 4 218 13 12 2
1.0 5 217 12 12 1
1.0 6 214 13 13 -2
2.0 1 361 289 23 0
2.0 2 362 287 22 1
2.0 3 362 286 22 1
3.0 5 124 56 18 0
3.0 6 126 52 17 2
到目前为止,我只能弄明白:
s = df.groupby('sample')
#gives me the groups
s["x"].nth(0)
#gets the first x value of each group
我只是不确定如何从该样本组中的所有x值中减去每个样本组的第一个x值。 有谁知道如何做到这一点?谢谢!
答案 0 :(得分:6)
您可以使用transform
使用first
创建的新Series
来减去列:
print (df.groupby('sample')['x'].transform('first'))
0 216
1 216
2 216
3 216
4 361
5 361
6 361
7 124
8 124
Name: x, dtype: int64
df['xdiff'] = df['x'] - df.groupby('sample')['x'].transform('first')
print (df)
time sample x y mass xdiff
0 3 1.0 216 12 12 0
1 4 1.0 218 13 12 2
2 5 1.0 217 12 12 1
3 6 1.0 234 13 13 18
4 1 2.0 361 289 23 0
5 2 2.0 362 287 22 1
6 3 2.0 362 286 22 1
7 5 3.0 124 56 18 0
8 6 3.0 126 52 17 2
df['xdiff'] = df['x'].sub( df.groupby('sample')['x'].transform('first'))
print (df)
time sample x y mass xdiff
0 3 1.0 216 12 12 0
1 4 1.0 218 13 12 2
2 5 1.0 217 12 12 1
3 6 1.0 234 13 13 18
4 1 2.0 361 289 23 0
5 2 2.0 362 287 22 1
6 3 2.0 362 286 22 1
7 5 3.0 124 56 18 0
8 6 3.0 126 52 17 2
使用apply
的解决方案:
df['xdiff'] = df.groupby('sample')['x'].apply(lambda x: x - x.iloc[0])
print (df)
time sample x y mass xdiff
0 3 1.0 216 12 12 0
1 4 1.0 218 13 12 2
2 5 1.0 217 12 12 1
3 6 1.0 234 13 13 18
4 1 2.0 361 289 23 0
5 2 2.0 362 287 22 1
6 3 2.0 362 286 22 1
7 5 3.0 124 56 18 0
8 6 3.0 126 52 17 2