[英]using stack to index multiple columns by a single column
我正在嘗試采用以下格式:
Global_Code | Retailer_X_Code | Retailer_Y_Code | Info | ...
-----------------------------------------------------------
'A' 'a' 'a_a' 1 ...
'B' 'b' 'b_b' 2 ...
... ... ... ... ...
並將Retailer_X_Code
和Retailer_Y_Code
堆疊到一個由Global_Code
索引的單個Retailer_Name
列中。 我還想將其他列保留在該行中,例如Info
。
因此,從stack()
,我得到:
stacked_df = mapping_df.stack()
========
Global_Code 'A'
Retailer_X_Code 'a'
Retailer_Y_Code 'a_a'
Info 1
...more columns
Global_Code 'B'
Retailer_X_Code 'b'
Retailer_Y_Code 'b_b'
Info 2
...more columns
太好了,現在我沒有所有的列,而是希望Retailer_X_Code
和Retailer_Y_Code
放在一列之內。 因此,我選擇了這些列(按Global_Code
組織):
stacked_df = mapping_df[['Global_Code', 'Retailer_X_Code', 'Retailer_Y_Code']].set_index('Global_Code').stack().reset_index().rename(columns={'level_1':'Retailer_Name', 0:'Retailer_Code'})
========
Global_Code | Retailer_Name | Retailer_Code
------------------------------------------
'A' 'Retailer_X_Code' 'a'
'A' 'Retailer_Y_Code' 'a_a'
... ... ...
'B' 'Retailer_X_Code' 'b'
'B' 'Retailer_Y_Code' 'b_b'
到目前為止一切順利 。 現在,我想獲取Info
並將include作為堆疊列結果的一部分。 所需的輸出應如下所示:
Global_Code | Retailer_Name | Retailer_Code | Info
------------------------------------------------------
'A' 'Retailer_X_Code' 'a' 1
'A' 'Retailer_Y_Code' 'a_a' 1
... ... ... ...
'B' 'Retailer_X_Code' 'b' 2
'B' 'Retailer_Y_Code' 'b_b' 2
但是,如果我將Info
作為所選列的一部分添加,然后將其重命名為Product_Info
,則不會添加Info
列。
而是,它在Retailer_Name
下錯誤地插入了Info
值。
stacked_df = mapping_df[['Global_Code', 'Retailer_X_Code', 'Retailer_Y_Code', 'Info']].set_index('Global_Code').stack().reset_index().rename(columns={'level_1':'Retailer_Name', 0:'Retailer_Code', 1: 'Product_Info'})
========
Global_Code | Retailer_Name | Retailer_Code
------------------------------------------
'A' 'Retailer_X_Code' 'a'
'A' 'Retailer_Y_Code' 'a_a'
'A' 'Info' 1
'A' 'Info' 1
'A' 'Info' 1
... ... ...
'B' 'Retailer_X_Code' 'b'
'B' 'Retailer_Y_Code' 'b_b'
'B' 'Info' 2
上面沒有列重命名的.rename(columns={'level_1':'Retailer_Name', 0:'Retailer_Pack'})
給我:
Global_Code | level_1 | 0
------------------------------------------
'A' 'Retailer_X_Code' 'a'
'A' 'Retailer_Y_Code' 'a_a'
'A' 'Info' 1
'A' 'Info' 1
'A' 'Info' 1
... ... ...
'B' 'Retailer_X_Code' 'b'
'B' 'Retailer_Y_Code' 'b_b'
'B' 'Info' 2
做到這一點的方法是按需要的列進行index
: .set_index(['Index1', 'Index2'])
例如:
stacked_df = mapping_df[['Global_Code', 'Retailer_X_Code', 'Retailer_Y_Code', 'Info']].set_index(['Global_Code', 'Info']).stack().reset_index().rename(columns={'level_1':'Retailer_Name', 0:'Retailer_Code', 1: 'Product_Info'})
得到:
Global_Code | Info | Retailer_Name | Retailer_Code
------------------------------------------------------
'A' 1 'Retailer_X_Code' 'a'
'A' 1 'Retailer_Y_Code' 'a_a'
... ... ...
'B' 2 'Retailer_X_Code' 'b'
'B' 2 'Retailer_Y_Code' 'b_b'
我們使用wide_to_long
.. :-),如果要更改列名,可以rename
..
pd.wide_to_long(df,stubnames='Retailer',i=['Global_Code','Info'],j='Retailer_Name',sep='_',suffix='\\w+').reset_index()
Out[155]:
Global_Code Info Retailer_Name Retailer
0 'A' 1 X_Code 'a'
1 'A' 1 Y_Code 'a_a'
2 'B' 2 X_Code 'b'
3 'B' 2 Y_Code 'b_b'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.