Я хочу объединить две сводные таблицы pandas, но у меня возникают проблемы с обслуживанием столбцов - PullRequest
2 голосов
/ 21 февраля 2020

Итак, я создаю две отдельные pandas сводные таблицы с кодом ниже

df = pd.read_excel('Report.xlsx')

df_past = df[df['Delivery'] < today]
df_future=df[df['Delivery'] > today]

table_past = pd.pivot_table(
    data=df_past,
    values=['Order', 'Prod'],
    index=['Sales Order', 'Name', 'Delivery'],
    aggfunc={'Order':np.sum, 'Prod':np.sum}
    )

table_future = pd.pivot_table(
    data=df_future,
    values=['Order', 'Prod'],
    index=['Sales Order', 'Name', 'Delivery'],
    aggfunc={'Order':np.sum, 'Prod':np.sum}
    )

, который создает следующие две таблицы.

                                            Order          Prod
Sales Order Name     Delivery                             
B11156456   Amazon   2020-02-18                19             2
B11164868   Google   2020-02-19                10             3
B11165869   Facebook 2020-02-15               130             0

                                            Order          Prod
Sales Order Name     Delivery                             
B11164868   Google   2020-02-27                15             9
B11165869   Facebook 2020-02-24                94            15
B11167123   Tesla    2020-02-27               365            69
B11168132   Samsung  2020-02-28               285            57
B11169563   Lenovo   2020-03-01               105             7

, поэтому я хочу затем объединить эти две сводные таблицы в номере заказа со следующим кодом

final_table = table_past.merge(table_future, 
            on=['Sales Order', 'Name'],
            suffixes=('_past', '_future'),
            how='inner'
            )

Так что это работает, но я не могу поддерживать столбец доставки. Из-за того, что это индекс, а не значение. Но я не могу использовать его как поле значения, потому что я не использую на нем никакой aggfun c. Таким образом, он дает мне информацию ниже, в которой есть все, что мне нужно, за исключением доставки.

                      Order Balance_past  Prod Balance_past  Order Balance_future  Prod Balance_future
Sales Order Name                                                                                      
B11156456   Amazon                    19                  2                   NaN                  NaN
B11164868   Google                    10                  3                  15.0                  9.0
B11165869   Facebook                 130                  0                  94.0                 15.0

Моя цель состоит в том, чтобы информация отображалась как можно ближе к приведенной ниже

                                            Order         Prod 
Sales Order Name     Delivery                             
B11156456   Amazon   2020-02-18                19             2
B11164868   Google   2020-02-19                10             3
                     2020-02-27                15             9
B11165869   Facebook 2020-02-15               130             0
                     2020-02-24                94            15
B11167123   Tesla    2020-02-27               365            69
B11168132   Samsung  2020-02-28               285            57
B11169563   Lenovo   2020-03-01               105             7

Но Я не могу сделать это напрямую, потому что мне нужно включить ТОЛЬКО вторую дату Доставки для каждого Заказа на продажу, если первая Дата Доставки сегодня или ранее. Так, например, я не хочу включать номер заказа на продажу B11169563, потому что у него есть одна дата в будущем, но я хочу включить номер заказа на продажу B11164868, потому что первая дата предшествует сегодня, а вторая дата находится в будущее. И я также хочу включить B11156456, потому что у него есть одна дата, и это в прошлом. Или для большей ясности. Если есть одна дата доставки, она должна быть в прошлом. Если есть две даты доставки, то одна должна быть в прошлом, а другая должна быть в будущем.

1 Ответ

0 голосов
/ 21 февраля 2020

Ваше требование становится проще, если вы используете функции pandas .reset_index () и pandas .set_index () для фреймов данных pivot_table.

Оператор слияния не учитывает индексы, которые здесь не передаются - on = ['Заказ на продажу', 'Имя'] Используйте reset_index () перед оператором слияния и set_index () после оператора слияния. Пожалуйста, рассмотрите следующие изменения в вашем коде.

df = pd.read_excel('Report.xlsx')
df_past = df[df['Delivery'] < today]
df_future=df[df['Delivery'] > today]

table_past = pd.pivot_table(
    data=df_past,
    values=['Order', 'Prod'],
    index=['Sales Order', 'Name', 'Delivery'],
    aggfunc={'Order':np.sum, 'Prod':np.sum}
    )

table_future = pd.pivot_table(
    data=df_future,
    values=['Order', 'Prod'],
    index=['Sales Order', 'Name', 'Delivery'],
    aggfunc={'Order':np.sum, 'Prod':np.sum}
    )
**table_past.reset_index(inplace=True)**
**table_future.reset_index(inplace=True)**

final_table = table_past.merge(table_future, 
            on=['Sales Order', 'Name'],
            suffixes=('_past', '_future'),
            how='inner'
            )
**final_table.set_index(['Sales Order', 'Name', 'Delivery'])**

Надеюсь, это сработает.

...