我有一个这样的数据框架:
df = pd.DataFrame(np.random.randint(0,30,size=10),
columns=["Random"],
index=pd.date_range("20180101", periods=10))
df=df.reset_index()
df.loc[:,'Random'] = [31,11,21,23,43,42,51,47,49,22]
df['id']=[1,1,1,2,2,2,3,3,3,3]
df['diff']=[3,2,4,1,6,1,2,2,3,1]
df
我想创建一个新的列'百分比'通过使用'diff'列同一行和'随机'列前一行的每个id?例如,列"百分比"中第二行的值将是(2/31)*100。对于第一行(每个id),列"百分比"将是NAN,因为我们没有"随机"列信息。怎么做呢?我可以这样做,如果它不是每个id使用shift,但不确定如何使用group by和shift在同一时间(或其他东西)。
您可以使用GroupBy.shift
:
df['Percentage'] = df['diff'].div(df.groupby('id')['Random'].shift()).mul(100)
输出:
index Random id diff Percentage
0 2018-01-01 31 1 3 NaN
1 2018-01-02 11 1 2 6.451613
2 2018-01-03 21 1 4 36.363636
3 2018-01-04 23 2 1 NaN
4 2018-01-05 43 2 6 26.086957
5 2018-01-06 42 2 1 2.325581
6 2018-01-07 51 3 2 NaN
7 2018-01-08 47 3 2 3.921569
8 2018-01-09 49 3 3 6.382979
9 2018-01-10 22 3 1 2.040816