我正在尝试采用以下格式开头的格式:
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
堆叠到一个Retailer_Name
列中,并按Global_Code
编制索引。我还想在行中保留其他列,例如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
列。
相反,它会在Info
下错误地插入Retailer_Name
值。
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
答案 0 :(得分:1)
执行此操作的方法是index
所需的列:.set_index(['Index1', 'Index2'])
E.g:
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'
答案 1 :(得分:1)
我们使用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'