根据另一列的值不同地移动行

时间:2019-05-03 10:20:07

标签: python-3.x pandas

我想获取尾十二个月(ttm)数据的值,而我仅获得年初至今的数据。我想通过添加新列来解决此问题,然后根据数据月份移动另一行。

df是这样的:

date         data     data_ttm
2019-03-31     12       Nan          
2018-12-31     10       Nan         
2018-09-30      8       Nan              
2018-06-30     11       Nan          
2018-03-31      9       Nan         
2017-12-31     12       Nan
2017-09-30     10       Nan
2017-06-30      4       Nan
2017-03-31      7       Nan

有4个月:12-31、09-30、06-30、03-31。

对于2018-12-31,data_ttm与数据相同。

对于2018-09-30,data_ttm为:data(2018-09-30)-data(2017-09-30)+ data(2017-12-31)。

我决定添加新列['month','data_minus']来解决

df=pd.DataFrame([[datetime.datetime(2019,3,31),'12','NaN'],
                 [datetime.datetime(2018,12,31),'10','NaN'],
                 [datetime.datetime(2018,9,30),'8','NaN'],
                 [datetime.datetime(2018,6,30),'11','NaN'],
                 [datetime.datetime(2018,3,31),'9','NaN'],
                 [datetime.datetime(2017,12,31),'12','NaN'],
                 [datetime.datetime(2017,9,30),'10','NaN'],
                 [datetime.datetime(2017,6,30),'4','NaN'],
                 [datetime.datetime(2017,3,31),'7','NaN']],
                 columns=list(['date','data','data_ttm']))

df['month']=df['date'].map(lambda x: x.month)
df['data_minus']=df['data'].shift(-df['month']/3)-df['data'].shift(-4)
df.loc[df['month']==12,'data_minus']=0  #for the month is 12
df['data_ttm']=df['data']-df['data_minus']

并得到错误结果:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我尝试搜索错误,但是搜索到的情况与我不同。

我期望的结果是这样的:

date         data     data_ttm
2019-03-31     12       13         
2018-12-31     10       10         
2018-09-30      8       10              
2018-06-30     11       19         
2018-03-31      9       14          
2017-12-31     12       Nan
2017-09-30     10       Nan
2017-06-30      4       Nan
2017-03-31      7       Nan

此外,我认为可能会有更好的方法来获取ttm数据。


于2019年5月4日更新

代码的问题是

df['data_minus']=df['data'].shift(-df['month']/3)-df['data'].shift(-4)

由于df['month']是一个系列,因此报告错误。

现在我使用

for i in range(1,5):
    df[df['month']==i*3,'data_minus']=df['data'].shift(-i)#.astype(float)

df['data_ttm']=df['data']+df['data_minus']-df['data'].shift(-4)#.astype(float)

替换错误一。但是我认为代码仍然很难看。有更好的方法吗?

0 个答案:

没有答案