在Pandas中,如何将“长”表转换为“宽而稀疏”的表?

时间:2017-01-29 15:49:15

标签: python pandas numpy dataframe sparse-matrix

我的术语太可怕了,所以这个值得一些解释。想象一下,我有一个像这样的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

显然,这是一个很大的转变。是否有内置功能可以做到这一点?看起来这可能是一件非常普遍的事情。

谢谢!

1 个答案:

答案 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

重复项timestock的另一种可能解决方案:

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