【问题标题】:Boolean indexing using loc resulting in an error使用 loc 的布尔索引导致错误
【发布时间】:2017-08-16 17:15:33
【问题描述】:

我有两个相同股票的不同数据框,但一个数据框包含更多数据和不同的价格。 我想比较其中一列,看看它们的不同之处。 (以下是数据框的较小版本)

df

Date          Open    Close
2007-03-22    3.65      1.0
2007-03-23    3.87      1.0
2007-03-26    3.83      1.0
2007-03-27    3.61      1.0
2007-03-28    4.65      1.0

df2

Date          Open   Close
2007-03-22    3.15    1.0
2007-03-23    3.87    0.0
2007-03-26    3.33    0.0
2007-03-27    3.61    0.0
2007-03-28    4.65    0.0

由于其中一个数据框有更多日期,我尝试使用 loc 对其进行切片,然后使用布尔索引找出它们的不同之处。

我试过这样的

df.Open[df.loc['2010-01-04':, 'Open'] != df2.loc['2010-01-04':, 'Open']]

我只想比较两个数据框的“打开”列,并且只比较一个日期。我希望输出只是 df.Open 列(和索引),它们在各自的“打开”列中有所不同。

但我得到了错误,

pandas.core.indexing.IndexingError: Unalignable boolean Series key provided

【问题讨论】:

    标签: python pandas dataframe indexing boolean


    【解决方案1】:

    当您使用布尔索引时,要子集的对象必须与布尔系列具有相同的长度,请尝试以下操作:

    df.Open.loc['2010-01-04':][df.loc['2010-01-04':, 'Open'] != df2.loc['2010-01-04':, 'Open']]
    

    这个例子可以重现错误:

    df = pd.DataFrame({"A": [1,2,3,4]})    
    df.A[df.loc[2:, 'A'] == df.loc[2:, 'A']]
    

    IndexingError:提供了不可对齐的布尔系列键

    但这很好用:

    df.A.loc[2:][df.loc[2:, 'A'] == df.loc[2:, 'A']]
    
    #2    3
    #3    4
    #Name: A, dtype: int64
    

    【讨论】:

    • 非常有趣。我不知道这个规则。谢谢。
    猜你喜欢
    • 2019-04-17
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多