Python中基于多个条件(列)的逐行减法

时间:2018-07-03 18:11:45

标签: python-3.x pandas

我有以下数据:

date      locid month       price
11/2/2017   17  11/1/2017   -0.0025
11/2/2017   17  12/1/2017   0
11/2/2017   105 11/1/2017   -0.895
11/2/2017   105 12/1/2017   -1
11/3/2017   17  11/1/2017   -0.0025
11/3/2017   17  12/1/2017   0.01
11/3/2017   105 11/1/2017   -0.895
11/3/2017   105 12/1/2017   -1.01

我想返回一个结果,该结果显示每个日期每个月的每个locid的价格差异。结果将只有四行:

date        month       price
11/2/2017   11/1/2017   0.8925
11/2/2017   12/1/2017   1
11/3/2017   11/1/2017   0.8925
11/3/2017   12/1/2017   1.02

我仅通过以下行获得了结果:

df.loc[df['locid']==17].price - df.loc[df['locid']==105].price

但是,我认为这不是一个可靠的解决方案。在对df.date列进行排序之前,我的结果包含八行。另外,我不确定python / pandas是否与df.months匹配,我认为它们可能恰好处于正确的顺序。

我想知道如何:

1)确保我以正确的顺序进行减法(在这种情况下,我要使用locid 17-105),如果它们在我的数据中以相反的顺序怎么办?如果有三个locid,而我只想看到两个,该怎么办?

2)确保locid 17-105是date == 11/2/2017和month == 11/1/2017。 IE日期和月份必须匹配,然后减去

3)如果首先进行数据透视,该如何进行减法

谢谢

1 个答案:

答案 0 :(得分:0)

groupbydiff一起使用,然后将内部concat回到原始df

df1=df.drop(['locid','price'],axis = 1)
df2=df.groupby(['date','month']).price.diff().dropna().abs()
pd.concat([df1,df2], axis = 1 ,join ='inner' )
Out[552]: 
        date      month   price
2  11/2/2017  11/1/2017  0.8925
3  11/2/2017  12/1/2017  1.0000
6  11/3/2017  11/1/2017  0.8925
7  11/3/2017  12/1/2017  1.0200