Use*_*rR6 5 python dataframe pandas
我在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
Run Code Online (Sandbox Code Playgroud)
结果我想要的是:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止我只能弄清楚:
s = df.groupby('sample')
#gives me the groups
s["x"].nth(0)
#gets the first x value of each group
Run Code Online (Sandbox Code Playgroud)
我只是不确定如何从该样本组中的所有x值中减去每个样本组的第一个x值.有谁知道如何做到这一点?谢谢!
您可以通过.减去新列Series使用创建transform具有first:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
解决方案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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |