繁体   English   中英

使用 Pandas 将列索引堆叠在一起

[英]Stacking column indices on top of one another using Pandas

我希望将一些列的索引堆叠在一起,这就是我目前拥有的:

                          
            Buy     Buy Currency   Sell     Sell Currency   
Date                        
2013-12-31  100     CAD            100      USD
2014-01-02  200     USD            200      CAD
2014-01-03  300     CAD            300      USD
2014-01-06  400     USD            400      CAD

这就是我想要实现的目标:

Buy/Sell     Buy/Sell Currency   
                     

100          USD
100          CAD
200          CAD
200          USD
300          USD
300          CAD

依此类推,基本上想要获取“买入”和“买入货币”中的值,并将它们的值一个接一个地堆叠在“卖出”和“卖出货币”列中。

等等。 我应该提到我的数据框总共有 10 列,所以使用

df_pl.stack(level=0)

似乎不起作用。

一种选择是使用pyjanitor中的pivot_longer ,对于这个特定的用例,您传递一个正则表达式列表(到names_pattern )以将所需的列标签聚合到新组中(在names_to中):

# pip install pyjanitor
import pandas as pd
import janitor

df.pivot_longer(index=None, 
                names_to = ['Buy/Sell', 'Buy/Sell Currency'], 
                names_pattern = [r"Buy$|Sell$", ".+Currency$"], 
                ignore_index = False, 
                sort_by_appearance=True)

            Buy/Sell Buy/Sell Currency
Date                                  
2013-12-31       100               CAD
2013-12-31       100               USD
2014-01-02       200               USD
2014-01-02       200               CAD
2014-01-03       300               CAD
2014-01-03       300               USD
2014-01-06       400               USD
2014-01-06       400               CAD

使用连接

import pandas as pd


print(pd.concat(
    [df['Buy'], df['sell']], axis=1
).stack().reset_index(1, drop=True).rename(index='buy/sell')
)

输出:

0    100
0    100
1    200
1    200
2    300
2    300
3    400
3    400
# assuming that your data has date as index.
df.set_index('date', inplace=True)


# create a mapping to new column names
d={'Buy Currency': 'Buy/Sell Currency', 
   'Sell Currency' : 'Buy/Sell Currency',
   'Buy' : 'Buy/Sell',
   'Sell' :'Buy/Sell'
  }
df.columns=df.columns.map(d)



# stack first two columns over the next two columns
out=pd.concat([ df.iloc[:,:2],
            df.iloc[:,2:]
          ],
           ignore_index=True
          )
out
    Buy/Sell    Buy/Sell Currency
0   100     CAD
1   200     USD
2   300     CAD
3   400     USD
4   100     USD
5   200     CAD
6   300     USD
7   400     CAD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM