我的术语很糟糕,所以这个值得解释。 假设我有一个这样的数据帧(我称之为"长"表):
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
.
.
.
我想将其转换为这样的数据帧(我称之为"宽而稀疏"表):
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
所以很明显,这是一个相当大的转变。 是否有内置函数可以执行此操作? 这似乎是一件很常见的事情。
谢谢!
您可以使用
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
但如果得到:
值错误:索引包含重复条目,无法重塑形状
是否有必要使用具有某些聚合函数的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