为每个id使用同一行的一列和其他列的前一行创建一个新列



我有一个这样的数据框架:

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