【问题标题】:Transform pandas Series into boolean matrix将熊猫系列转换为布尔矩阵
【发布时间】:2022-01-27 01:34:18
【问题描述】:

我有以下pd.Series 对象。

              ticker
date                
2020-02-06     BKBR3
2020-02-06     BRKM5
2020-02-06     CNTO3
..........    ......
2020-02-06    BIDI11
2020-02-06     BRPR3
2020-02-06     CVCB3
2020-02-06     ELET3
2020-02-06     GFSA3
2022-01-26    QETH11
2022-01-26     ABEV3
2022-01-26    BIDI11
2022-01-26     CRFB3
2022-01-26     LCAM3

我想把它变成一个布尔矩阵(不确定我是否使用了适当的术语),如下表所示。它具有与原始表相同的索引值,但ticker 列是旋转的,当列和索引在原始表中时值为True,当它们不在时为False

            BKBR3  BRKM5  CNTO3  .....
date                           
2020-02-06  True   False  False  .....
2020-02-10  False  False  False  .....
..........  .....  .....  .....

有谁知道一个聪明的方法吗?我尝试旋转表格,但由于它没有值,所以它不起作用。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您提供的输出看起来不像一个系列,它看起来像一个带有索引“日期”和一列“值”的数据框。我认为这就是事实——显然很容易在两者之间切换,因此您可能需要对以下内容进行一些小改动

    无论如何,你可以这样做——通过将其设为多索引df,然后unstack

    (df.set_index(['ticker'], append=True)
        .assign(v = True)
        .unstack(level=1)
        .fillna(False)
    )
    

    输出(对于您在问题中有输出的简短版本)

        v
    ticker      ABEV3   BIDI11  BKBR3   BRKM5   BRPR3   CNTO3   CRFB3   CVCB3   ELET3   GFSA3   LCAM3   QETH11
    date                                                
    2020-02-06  False   True    True    True    True    True    False   True    True    True    False   False
    2022-01-26  True    True    False   False   False   False   True    False   False   False   True    True
    

    编辑

    如果有重复的数据(同一日期的相同代码多次使用),则可以使用groupby 而不是set_index

    (df.reset_index()
        .assign(v = True)
        .groupby(['date','ticker']).first()
        .unstack(level=1)
        .fillna(False)
    )
    

    【讨论】:

    • 我尝试了您的解决方案,但在运行unstack 方法时它引发了ValueError: Index contains duplicate entries, cannot reshape
    • 我使用的是熊猫版1.3.5
    • 我在阅读this answer 上的评论时发现了问题。我的数据有一个重复的索引。谢谢!
    • @pelelter 很高兴你知道了;如果您合法需要它们,我编辑了处理重复索引的答案
    【解决方案2】:

    经过更多尝试后,设法使用pivot 方法做到了。

    df["bool"] = 1
    df = df.groupby(["date", "ticker"]).sum()
    df = df.reset_index()
    df = df.pivot(index="date", columns="ticker", values="bool")
    df = df.fillna(0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2016-08-23
      • 1970-01-01
      • 2014-11-23
      相关资源
      最近更新 更多