我有一个数据框,如下所示:
data = {'sid':[1,1,1,2,2,2],
'field1':['start', None, None, 'start', None, None],
'field2':['a', 'b', 'z', 'd', 'z','s'],
'val':[20, 22, 23, 40, 45, 47]}
df = pd.DataFrame(data)
print(df)
sid field1 val
0 1 start 20
1 1 None 22
2 1 None 23
3 2 start 40
4 2 None 45
5 2 None 47
我想创建一个新字段 newval 来存储该行的 val 与具有相同行的 val 之间的差异sid 和 field1 = '开始'。
sid field1 val newval
0 1 start 20 NaN
1 1 None 22 2.0
2 1 None 23 3.0
3 2 start 40 NaN
4 2 None 45 5.0
5 2 None 47 7.0
我已经尝试过 diff() 和 groupby() 但这给了我一个运行差异。
df['newval'] = df.groupby('sid')['val'].diff()
sid field1 val newval
0 1 start 20 NaN
1 1 None 22 2.0
2 1 None 23 1.0
3 2 start 40 NaN
4 2 None 45 5.0
5 2 None 47 2.0
如何从特定行中获取差异?
最佳答案
您可以将 groupby 与辅助列和 sid
一起使用,然后获取组的第一个值,然后从 val
字段中减去。
df['new_val'] = (df['val']-
df.groupby(['sid',df['field1'].eq("start").cumsum()])['val'].transform("first"))
print(df)
sid field1 field2 val new_val
0 1 start a 20 0
1 1 None b 22 2
2 1 None z 23 3
3 2 start d 40 0
4 2 None z 45 5
5 2 None s 47 7
辅助列如下,有助于分组:
print(df['field1'].eq("start").cumsum())
0 1
1 1
2 1
3 2
4 2
5 2
Name: field1, dtype: int32
https://stackoverflow.com/questions/65367327/