【问题标题】:Merge two columns of equal length into one将两列长度相等的列合并为一列
【发布时间】:2018-12-31 15:58:39
【问题描述】:
我有一个包含多列的 pandas DataFrame。我想要完成的是将两列的值组合/堆叠成一列,将每一列的值逐行堆叠(不幸的是,这个要求阻止我使用类似联合的解决方案)。其他剩余列的内容可以复制。非常感谢任何帮助
#Current DataFrame
print(df)
Stock Ticker Index Ticker Price Date
AAPL INDX 100 12/31/2018 8:57
GOOG RSL 123 12/31/2018 8:57
GM COMP 90 12/31/2018 8:57
MMM NIKK 340 12/31/2018 8:57
INVD EUR 30 12/31/2018 8:57
#Desired results
print(df2)
Stock and Bench Price Date
AAPL 100 12/31/2018 8:57
INDX 100 12/31/2018 8:57
GOOG 123 12/31/2018 8:57
RSL 123 12/31/2018 8:57
GM 90 12/31/2018 8:57
COMP 90 12/31/2018 8:57
MMM 340 12/31/2018 8:57
NIKK 340 12/31/2018 8:57
INVD 30 12/31/2018 8:57
EUR 30 12/31/2018 8:57
【问题讨论】:
标签:
python
pandas
dataframe
series
【解决方案1】:
您可以将价格和日期列设置为索引并堆叠股票和股票代码。最后使用 reset_index 进行一些清理。
df.set_index(['Date', 'Price'])[['Stock Ticker','Index Ticker']].stack()\
.reset_index(2,drop = True).reset_index(name = 'Stock and Bench')
Date Price Stock and Bench
0 12/31/2018 8:57 100 AAPL
1 12/31/2018 8:57 100 INDX
2 12/31/2018 8:57 123 GOOG
3 12/31/2018 8:57 123 RSL
4 12/31/2018 8:57 90 GM
5 12/31/2018 8:57 90 COMP
6 12/31/2018 8:57 340 MMM
7 12/31/2018 8:57 340 NIKK
8 12/31/2018 8:57 30 INVD
9 12/31/2018 8:57 30 EUR
【解决方案2】:
您可以使用pd.melt 设置Date 和Price 为id_vars:
(df.melt(id_vars=['Date', 'Price'],
value_name='Stock and Bench')
.drop('variable', axis=1))
Date Price Stock and Bench
0 12/31/2018/8:57 100 AAPL
1 12/31/2018/8:57 123 GOOG
2 12/31/2018/8:57 90 GM
3 12/31/2018/8:57 340 MMM
4 12/31/2018/8:57 30 INVD
5 12/31/2018/8:57 100 INDX
6 12/31/2018/8:57 123 RSL
7 12/31/2018/8:57 90 COMP
8 12/31/2018/8:57 340 NIKK
9 12/31/2018/8:57 30 EUR
或者使用pd.wide_to_long:
(pd.wide_to_long(df.reset_index(), stubnames='Ticker', i = 'index',
j = 'num', suffix='\w+')
.reset_index(drop=True)
.rename({'Ticker':'Stock and Bench'}, axis=1))
Date Price Stock and Bench
0 12/31/2018-8:57 100 AAPL
1 12/31/2018-8:57 123 GOOG
2 12/31/2018-8:57 90 GM
3 12/31/2018-8:57 340 MMM
4 12/31/2018-8:57 30 INVD
5 12/31/2018-8:57 100 INDX
6 12/31/2018-8:57 123 RSL
7 12/31/2018-8:57 90 COMP
8 12/31/2018-8:57 340 NIKK
9 12/31/2018-8:57 30 EUR