簡體   English   中英

我想合並兩個 Pandas 數據透視表,但在維護列時遇到問題

[英]I want to merge two pandas pivot tables but am having trouble maintaining columns

所以我用下面的代碼創建了兩個單獨的熊貓數據透視表

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'
            )

所以這有效,但我無法維護 Delivery 列。 因為它是一個索引而不是一個值。 但是我不能將它用作值字段,因為我沒有在它上面使用任何 aggfunc。 所以它給了我下面的信息,其中包含我需要的一切,除了交付。

                      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,因為它有一個日期,而且是過去的日期。 或者為了更清楚。 如果有一個交貨日期,它必須是過去的日期。 如果有兩個交貨日期,那么一個必須在過去,一個必須在將來。

如果您對pivot_table 的數據框使用pandas.reset_index() 和pandas.set_index() 函數,您的要求就會變得簡單。

Merge 語句不考慮這里沒有傳遞的索引- on=['Sales Order', 'Name']在merge 語句之前使用reset_index(),在merge 語句之后使用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'])**

希望這有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM