Pandas 数据框在列上使用索引和条件进行选择

Posted

技术标签:

【中文标题】Pandas 数据框在列上使用索引和条件进行选择【英文标题】:Pandas dataframe selecting with index and condition on a column 【发布时间】: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:作为索引器提供的不可对齐的布尔系列(布尔系列的索引与索引对象的索引不匹配)。

【问题讨论】:

【参考方案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

【讨论】:

你的解决方案非常好!

以上是关于Pandas 数据框在列上使用索引和条件进行选择的主要内容,如果未能解决你的问题,请参考以下文章

用于搜索的 Pandas 列索引?

在列*和*索引上使用 groupby 并与 pandas 数据框聚合

列上加索引时事有条件

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

在 Pandas 中合并索引上的数据帧更有效

索引-mysql