【问题标题】:Pandas dataframe selecting with index and condition on a columnPandas 数据框在列上使用索引和条件进行选择
【发布时间】:2022-01-18 12:36:19
【问题描述】:

我正在尝试一段时间来解决这个问题:

我有一个像这样的 daraframe:

import pandas as pd
df=pd.DataFrame(np.array([['A', 2, 3], ['B', 5, 6], ['C', 8, 9]]),columns=['a', 'b', 'c'])
j=[0,2]

但是当我尝试通过索引列表和列上的条件过滤时仅选择其中的一部分时,我得到错误...

df[df.loc[j]['a']=='A']

有一些错误,但我不明白这里有什么问题。你能帮帮我吗?

这是错误信息:

IndexingError:作为索引器提供的不可对齐的布尔系列(布尔系列的索引与索引对象的索引不匹配)。

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

    有过滤过的DataFrame和原来的比较,所以索引不一样,所以报错。

    你需要比较过滤后的DataFrame:

    df1 = df.loc[j]
    print (df1)
       a  b  c
    0  A  2  3
    2  C  8  9
    
    out = df1[df1['a']=='A']
    print(out)
       a  b  c
    0  A  2  3
    

    您的解决方案可以通过 Series.reindex 的原始索引转换过滤掩码的索引:

    out = df[(df.loc[j, 'a']=='A').reindex(df.index, fill_value=False)]
    print(out)
       a  b  c
    0  A  2  3
    

    或者更好的解决方案:

    out = df[(df['a'] == 'A') & (df.index.isin(j))]
    print(out)
       a  b  c
    0  A  2  3
    

    【讨论】:

      【解决方案2】:

      布尔数组和数据框的长度应该相同。这里你的 df 长度是 3 但布尔数组 df.loc[j]['a']=='A' 长度是 2

      你应该这样做:

      >>> df.loc[j][df.loc[j]['a']=='A']
         a  b  c
      0  A  2  3
      
      

      【讨论】:

      • 你的解决方案非常好!
      猜你喜欢
      • 2016-10-16
      • 2021-10-10
      • 2017-08-19
      • 2020-08-14
      • 2017-08-10
      • 2018-12-04
      • 2013-10-09
      • 2019-10-07
      相关资源
      最近更新 更多