Панды, добавляющие различные строки на основе нескольких критериев столбца / строки - PullRequest
0 голосов
/ 14 сентября 2018

Скажем, у меня есть продуктовый магазин и ежедневный список инвентаря для каждого фрукта.Мне нужно обновить ежедневный инвентарь из базы данных ежедневных итогов порчи.Как мне взять конечный инвентарь от 31.08.2008 и добавить его порчу с ночи 01.09.2017, чтобы получить начальный инвентарь на 9/1/2018.

Мои ежедневные продажи фруктовв консолидированном виде.

Fruit CurrentDate  DailyFruitSpoilage
0  Apple   2018-08-29  -10
1  Apple   2018-08-30  -20
2  Apple   2018-08-31  -30
3  Apple   2018-09-01  -40
4  Orange  2018-08-29  -10
5  Orange  2018-08-30  -20
6  Orange  2018-08-31  -30
7  Orange  2018-09-01  -40

Моя таблица инвентаря выглядит следующим образом:

Fruit CurrentDate  DailyEndingInventory  BeginningFruitInventory
0  Apple   2018-08-28  1000               1050
1  Apple   2018-08-29  900                990
2  Apple   2018-08-30  870                880
3  Apple   2018-08-31  820                840
4  Orange  2018-08-28  1000               1050
5  Orange  2018-08-29  900                990
6  Orange  2018-08-30  820                870
7  Orange  2018-08-31  750                790

Итак, чтобы получить инвентарь апельсина на 01.09.2008, я хочу взять свой апельсининвентарь от 31.08 (750) и добавьте к нему мой порчу апельсинов (-40) с ночи 01.09.2017, чтобы получить мой начальный инвентарь для апельсина 710, когда я начну день 1.09.08.DailyEndingInventory и DailyFruitSpoilage поступают из базы данных, я пытаюсь вычислить BeginningFruitInventory.

Моей первой мыслью было слияние, основанное на фруктах и ​​дате, но при этом строки в прошлом смещались на 1.Если это имеет смысл.

8/30's DailyEndingInventory + 8/31's DailyFruitSpoilage = 8/31's BeginningFruitInventory

В двух словах, как мне добавить столбцы, когда нужные мне данные находятся в разных строках?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Мы можем использовать массивы numpy для нарезки и добавления их.Предполагая, что df является таблицей порчи, а df2 является таблицей запасов, а 1050 - начальным количеством фруктов,

dfj=df.join(df2.set_index(['CurrentDate','Fruit']),on=['CurrentDate','Fruit'],how='outer')
dfj=dfj.sort_values(['Fruit','CurrentDate']).reset_index(None,True)
dfj.loc[1:,'BeginningFruitInventory']=np.array(dfj.DailyEndingInventory[:-1])+np.array(dfj.DailyFruitSpoilage[1:])
dfj.BeginningFruitInventory.fillna(1050,inplace=True)
dfj
    Fruit   CurrentDate     DailyFruitSpoilage  DailyEndingInventory    BeginningFruitInventory
0   Apple   2018-08-28  NaN     1000.0  1050.0
1   Apple   2018-08-29  -10.0   900.0   990.0
2   Apple   2018-08-30  -20.0   870.0   880.0
3   Apple   2018-08-31  -30.0   820.0   840.0
4   Apple   2018-09-01  -40.0   NaN     780.0
5   Orange  2018-08-28  NaN     1000.0  1050.0
6   Orange  2018-08-29  -10.0   900.0   990.0
7   Orange  2018-08-30  -20.0   820.0   880.0
8   Orange  2018-08-31  -30.0   750.0   790.0
9   Orange  2018-09-01  -40.0   NaN     710.0
  • Объедините два кадра данных на CurrentDate и фрукты
  • Сортировка и сброс индекса
  • Используйте np.array () для добавления фрагментов каждой серии без учета индекса
  • В качестве альтернативы, вы также можете выполнить reset_index после нарезки и добавить их нормально.
0 голосов
/ 14 сентября 2018

Учитывая ваши данные:

data_1 = {'Fruit': ['Apple', 'Apple', 'Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Orange'],
        'CurrentDate': ['2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01', '2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01'],
        'DailyFruitSpoilage': [-10, -20, -30, -40, -10, -20, -30, -40]}

data_2 = {'Fruit': ['Apple', 'Apple', 'Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Orange'],
        'CurrentDate': ['2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01', '2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01'],
        'DailyEndingInventory': [1000, 900, 870, 820, 1000, 900, 820, 750]}

df_1 = pd.DataFrame(data_1)
df_2 = pd.DataFrame(data_2)

Приведите даты соответственно и создайте смещение даты:

df_1['CurrentDate'] = pd.PeriodIndex(df_1['CurrentDate'], freq='D')
df_1['Date'] = pd.PeriodIndex(df_1['CurrentDate'], freq='D')
df_2['Date'] = pd.PeriodIndex(df_2['CurrentDate'], freq='D')
df_2['Date'] += 1

Затем объедините data_frames с лагом:

df_3 = df_1.merge(df_2, on=['Date','Fruit'], suffixes=('','_lag'), how='right')

Рассчитать разницу в столбцах и затем сместить соответственно:

df_3['BeginningInventory'] = df_3['DailyFruitSpoilage'] + df_3['DailyEndingInventory']

df_3.BeginningInventory = df_3.BeginningInventory.shift(+1)

И вы возвращаете столбец BeginningInventory так:

Index   Fruit CurrentDate  DailyFruitSpoilage       Date CurrentDate_lag  DailyEndingInventory  BeginningInventory
0   Apple  2018-08-30               -20.0 2018-08-30      2018-08-29                  1000                 NaN
1   Apple  2018-08-31               -30.0 2018-08-31      2018-08-30                   900               980.0
2   Apple  2018-09-01               -40.0 2018-09-01      2018-08-31                   870               870.0
3  Orange  2018-08-30               -20.0 2018-08-30      2018-08-29                  1000               830.0
4  Orange  2018-08-31               -30.0 2018-08-31      2018-08-30                   900               980.0
5  Orange  2018-09-01               -40.0 2018-09-01      2018-08-31                   820               870.0
6   Apple         NaT                 NaN 2018-09-02      2018-09-01                   820               780.0
7  Orange         NaT                 NaN 2018-09-02      2018-09-01                   750                 NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...