Shu*_*m R 2 python dataframe pandas
我有一个数据框:
id value
0 1 0
1 1 100
2 1 200
3 1 300
4 1 0
5 2 0
6 2 500
7 2 600
8 2 0
9 3 0
10 3 700
11 3 0
Run Code Online (Sandbox Code Playgroud)
对于值列中的每个条目,我想添加属于值列中下一行条目的新列,
例如:
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
4 2 0 500
5 2 500 600
6 2 600 0
7 3 0 700
8 3 700 0
Run Code Online (Sandbox Code Playgroud)
选项 1
通过使用 numpy 而不是pd.Series.shift我避免插入np.nan和强制转换为float
df.groupby(
'id', group_keys=False
).apply(lambda d: d.iloc[:-1].assign(value2=d.value.values[1:]))
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
Run Code Online (Sandbox Code Playgroud)
选项 2
如果你所有的'id'都放在一起,我可以np.roll在整个列上做一个,然后再做一个简单的groupby。
df.assign(
value2=np.roll(df.value.values, -1)
).groupby('id', group_keys=False).apply(pd.DataFrame.head, n=-1)
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
Run Code Online (Sandbox Code Playgroud)