具有以下数据帧
token name ltp change
0 12345.0 abc 6.0 NaN
1 12345.0 abc 10.0 67.0
2 12345.0 abc 17.0 70.0
3 12345.0 abc 17.0 0.0
4 12345.0 abc 18.0 6.0
5 12345.0 abc 20.0 11.0
6 6789.0 xyz 2.0 -90.0
7 6789.0 xyz 3.0 50.0
8 6789.0 xyz 9.0 200.0
9 6789.0 xyz 16.0 78.0
10 6789.0 xyz 16.0 0.0
11 6789.0 xyz 18.0 12.0
我需要实现以下目标:
在"名称"列中,如果名称发生更改,则"更改"列应为"nan"。 如果相同,则应通过比较连续的 LTP 得出变化。
为了识别"名称"列的每个元素,我使用了 loc 方法。下面是我的代码。
if df.loc[0:0,'name']==df.loc[1:1,'name']:
df['change']=df['ltp'].pct_change().round(decimals=2)*100
else:
df['change']='nan'
我收到错误:
ValueError: Can only compare identically-labeled Series objects
我怎样才能做到这一点比较?
你想用pct_change
做groupby
:
df.groupby('name')['ltp'].pct_change()
输出:
0 NaN
1 0.666667
2 0.700000
3 0.000000
4 0.058824
5 0.111111
6 NaN
7 0.500000
8 2.000000
9 0.777778
10 0.000000
11 0.125000
Name: ltp, dtype: float64
将其分配给数据框中的列:
df['% change'] = df.groupby('name')['ltp'].pct_change().round(2).mul(100)
df
输出:
token name ltp change % change
0 12345.0 abc 6.0 NaN NaN
1 12345.0 abc 10.0 67.0 67.0
2 12345.0 abc 17.0 70.0 70.0
3 12345.0 abc 17.0 0.0 0.0
4 12345.0 abc 18.0 6.0 6.0
5 12345.0 abc 20.0 11.0 11.0
6 6789.0 xyz 2.0 -90.0 NaN
7 6789.0 xyz 3.0 50.0 50.0
8 6789.0 xyz 9.0 200.0 200.0
9 6789.0 xyz 16.0 78.0 78.0
10 6789.0 xyz 16.0 0.0 0.0
11 6789.0 xyz 18.0 12.0 12.0