Вычитание строк друг из друга в кадре данных - PullRequest
0 голосов
/ 01 октября 2019

Я предполагаю, что это довольно простая проблема, но просто не могу заставить код работать правильно. Это упрощенная версия моего фрейма данных.

df = pd.DataFrame([['Jan', 'Apples', 10], ['Feb', 'Apples', 14], 
                   ['Jan', 'Oranges', 24], ['Feb', 'Oranges', 18]],
                    columns = ['Month', 'Fruit', 'Sales'])

  Month    Fruit  Sales
0   Jan   Apples     10
1   Feb   Apples     14
2   Jan  Oranges     24
3   Feb  Oranges     18

Затем я хочу вычислить две новые строки, которые представляют собой продажи за февраль минус продажи за январь, сгруппированные по типам фруктов. Я видел функцию diff, которая очевидно работала бы с этим упрощенным фреймом данных. Но мой реальный кадр данных намного больше, и число периодов между значениями, которые я хочу вычесть, не является постоянным. Так что я ищу что-то с loc и groupby (я полагаю).

Очень ценю любой совет.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Чтобы убедиться, что вы вычитаете продажи в Feb из Jan, можно указать столбец Month как pd.Categorical, указав порядок для categories и взять diff из двух первых значений Sales, которые также будут работать с дополнительными месяцами:

   Month    Fruit  Sales
0   Jan   Apples     10
2   Apr   Apples     21
3   Feb   Apples     14
4   Apr   Apples     21
5   Jan  Oranges     24
6   Feb  Oranges     18

df['Month'] = pd.Categorical(df.Month.tolist(), categories=['Jan', 'Feb'])
df.sort_values('Month', inplace=True)
df.groupby('Fruit').Sales.apply(lambda x: x.head(2).diff().iloc[1])

Fruit
Apples     4.0
Oranges   -6.0
Name: Sales, dtype: float64
​
0 голосов
/ 01 октября 2019

IICU, это то, что вам нужно. По мере увеличения количества месяцев это даст разницу в продажах между двумя месяцами.

df['dif']= df.groupby(['Fruit'])['Sales'].diff().fillna(0).astype(int)
print(df)

Выпуск

    Month   Fruit   Sales   dif
0   Jan     Apples      10  0
1   Feb     Apples      14  4
2   Jan     Oranges     24  0
3   Feb     Oranges     18  -6

ИЛИ

Вы можете использовать пользовательскую функцию ниже

def func(mon1,mon2,fruit):
    g = df.groupby(['Fruit'])
    f = g.get_group(fruit)
    a = f.loc[f.Month == mon1, 'Sales'].iloc[0]
    b = f.loc[f.Month == mon2, 'Sales'].iloc[0]
    return b-a

Вызовите функцию, например, func('Jan', 'Feb', 'Oranges'), и вы получите разницу в продажах между месяцами для соответствующего фрукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...