我的术语太可怕了,所以这个值得一些解释。想象一下,我有一个像这样的DataFrame(我称之为“长”表):
time stock price
---------------------------
13:03:00 AAPL 100.00
13:03:00 SPY 200.00
13:03:01 AAPL 100.01
13:03:02 SPY 200.01
13:03:03 SPY 200.02
.
.
.
我希望将它转换为像这样的DataFrame(我称之为“宽和稀疏”表):
time AAPL SPY
---------------------------
13:03:00 100.00 200.00
13:03:01 100.01 Nan
13:03:02 Nan 200.01
13:03:03 Nan 200.02
显然,这是一个很大的转变。是否有内置功能可以做到这一点?看起来这可能是一件非常普遍的事情。
谢谢!
答案 0 :(得分:3)
您可以使用pivot
:
df = df.pivot(index='time', columns='stock', values='price')
print (df)
stock AAPL SPY
time
13:03:00 100.00 200.00
13:03:01 100.01 NaN
13:03:02 NaN 200.01
13:03:03 NaN 200.02
unstack
的另一个解决方案:
df = df.set_index(['time', 'stock']).price.unstack()
print (df)
stock AAPL SPY
time
13:03:00 100.00 200.00
13:03:01 100.01 NaN
13:03:02 NaN 200.01
13:03:03 NaN 200.02
但如果得到:
ValueError:索引包含重复的条目,无法重塑
necessery是否使用pivot_table
和一些聚合函数,默认为np.mean
。
print (df)
time stock price
0 13:03:00 AAPL 100.00
1 13:03:00 SPY 200.00
2 13:03:01 AAPL 100.01
3 13:03:02 SPY 200.01
4 13:03:03 SPY 200.02
5 13:03:03 SPY 500.02 <- duplicates for same time and stock
df = df.pivot_table(index='time', columns='stock', values='price')
print (df)
stock AAPL SPY
time
13:03:00 100.00 200.00
13:03:01 100.01 NaN
13:03:02 NaN 200.01
13:03:03 NaN 350.02
重复项time
和stock
的另一种可能解决方案:
df = df.groupby(['time', 'stock']).price.mean().unstack()
print (df)
stock AAPL SPY
time
13:03:00 100.00 200.00
13:03:01 100.01 NaN
13:03:02 NaN 200.01
13:03:03 NaN 350.02