Bha*_*ana 2 python dataframe pandas
我有一个数据框,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我想创建一个新的领域的newval存储之间的区别VAL该行和VAL与同一行中的SID和字段1 =“开始”。
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
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 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
Run Code Online (Sandbox Code Playgroud)
如何从特定行获得差异?
您可以将 groupby 与辅助列一起使用sid
,然后获取组的第一个值,然后从val
字段中减去。
df['new_val'] = (df['val']-
df.groupby(['sid',df['field1'].eq("start").cumsum()])['val'].transform("first"))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
helper 列如下,有助于分组:
print(df['field1'].eq("start").cumsum())
0 1
1 1
2 1
3 2
4 2
5 2
Name: field1, dtype: int32
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
51 次 |
最近记录: |