[英]I am trying to pivot a json file using pandas to be in a specific format. I want to pivot it on certain columns
[英]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,因為它有一個日期,而且是過去的日期。 或者為了更清楚。 如果有一個交貨日期,它必須是過去的日期。 如果有兩個交貨日期,那么一個必須在過去,一個必須在將來。
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.