Мудрое вычитание строк на основе нескольких критериев (столбцов) в Python - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующие данные:

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), что если они были в обратном порядке в моих данных ? Что если бы было три локуса, а я хотел увидеть только два?

2) убедитесь, что 17-105 - это дата == 11/2/2017 и месяц == 11/1/2017. IE дата и месяц должны совпадать, прежде чем вычесть

3) если данные были сначала повернуты, как сделать вычитание

Спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Используя groupby с diff, затем внутренним 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...