根据月份在熊猫中的环比值更新一列

时间:2019-08-20 14:50:27

标签: python pandas

对于以下数据帧:

   name       date  price  percent
0    wh   2019/1/1    nan     -0.1
1    wh   2019/2/1    nan      0.0
2    wh   2019/3/1    nan      0.0
3    wh   2019/4/1    nan      0.1
4    wh   2019/5/1    nan     -0.1
5    wh   2019/6/1    2.5      0.0
6    sh   2018/6/1    nan      nan
7    sh   2018/7/1    nan     -0.4
8    sh   2018/8/1    nan      0.7
9    sh   2018/9/1    nan     -0.5
10   sh  2018/10/1    nan      0.0
11   sh  2018/11/1    nan      0.4
12   sh  2018/12/1    nan      0.3
13   sh   2019/1/1    nan      nan
14   sh   2019/6/1    2.4      0.0

在@WeNYoBen的帮助下:

df=df.set_index(['name','date']).unstack().stack(dropna=False).reset_index()
df['date']=pd.to_datetime(df['date'])
df1 = df.sort_values(['name','date'])
print(df1)

输出:

   name       date  price  percent
3    sh 2018-06-01    nan      nan
4    sh 2018-07-01    nan     -0.4
5    sh 2018-08-01    nan      0.7
6    sh 2018-09-01    nan     -0.5
0    sh 2018-10-01    nan      0.0
1    sh 2018-11-01    nan      0.4
2    sh 2018-12-01    nan      0.3
7    sh 2019-01-01    nan      nan
8    sh 2019-02-01    nan      nan
9    sh 2019-03-01    nan      nan
10   sh 2019-04-01    nan      nan
11   sh 2019-05-01    nan      nan
12   sh 2019-06-01    2.4      0.0
16   wh 2018-06-01    nan      nan
17   wh 2018-07-01    nan      nan
18   wh 2018-08-01    nan      nan
19   wh 2018-09-01    nan      nan
13   wh 2018-10-01    nan      nan
14   wh 2018-11-01    nan      nan
15   wh 2018-12-01    nan      nan
20   wh 2019-01-01    nan     -0.1
21   wh 2019-02-01    nan      0.0
22   wh 2019-03-01    nan      0.0
23   wh 2019-04-01    nan      0.1
24   wh 2019-05-01    nan     -0.1
25   wh 2019-06-01    2.5      0.0

在列na中用zero填充percent

df1['percent'].fillna(0, inplace=True)

最后一步,如果我们拥有price列的所有值,则可以使用df['percent']=df.groupby('name').price.pct_change()计算df['percent'],但是现在我需要使用percent来计算{{1 }}。

最终结果如下:

price

如果还有其他问题,请告诉我。预先感谢。

相关参考:

Pandas: Add data for missing months

1 个答案:

答案 0 :(得分:1)

使用unstackstack组合

df=df.set_index(['name','date']).unstack().stack(dropna=False).reset_index()
#df['date']=pd.to_datetime(df['date'])
#df=df.sort_values('date')
df['Pct']=df.groupby('name').price.pct_change()