【问题标题】:In Pandas, how can I convert a "long" table to a "wide and sparse" table?在 Pandas 中,如何将“长”表转换为“宽而稀疏”表?
【发布时间】:2017-09-28 00:52:27
【问题描述】:

我的术语很糟糕,所以这个值得解释一下。想象一下,我有一个这样的 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

所以显然这是一个相当大的转变。有没有内置函数可以做到这一点?这似乎是一件很常见的事情。

谢谢!

【问题讨论】:

    标签: python pandas numpy dataframe sparse-matrix


    【解决方案1】:

    你可以使用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:索引包含重复条目,无法重塑

    是否需要使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2020-11-26
      • 2017-06-23
      • 1970-01-01
      相关资源
      最近更新 更多