当列名在列表中时,基于列上的多个条件选择DataFrame行

时间:2019-08-01 13:02:43

标签: pandas dataframe

我需要在某些条件下对某些列上的行进行过滤。 这些列显示在列表中。所有列的条件都相同,也可以不同。对于我的工作,条件是相同的。

不起作用

labels = ['one', 'two', 'three']

df = df [df [x] == 1 for x in labels]  

以下代码有效:

df_list = []

for x in labels:

  df_list.append(df[(df [x] == 1)])

df5 = pd.concat(df_list).drop_duplicates()

创建不同的数据框并通过避免重复来简化它们。

预期: 它应该过滤出那些列的值为1的行。

实际: ValueError:太多值无法解包(预期1)

我了解错误的原因。有什么办法可以通过修改不起作用的代码来构造条件?

2 个答案:

答案 0 :(得分:2)

我认为您可以使用以下代码重写它。

labels = ['one','two','three']

df5 = df[(df[labels] == 1).any(1)]

让我们用此MCVE进行测试:

#Create test data
df = pd.DataFrame(np.random.randint(1,5,(10,5)), columns=[*'ABCDE'])
labels = ['A','B','E']

#Your code
df_list = []
for x in labels:

  df_list.append(df[(df [x] == 1)])

df5 = pd.concat(df_list).drop_duplicates()


#Suggested modification
df6 = df[(df[labels] == 1).any(1)]

它们相等吗?

df5.eq(df6)

输出:

      A     B     C     D     E
1  True  True  True  True  True
4  True  True  True  True  True
6  True  True  True  True  True
7  True  True  True  True  True
8  True  True  True  True  True

答案 1 :(得分:0)

您需要这个吗?

new_df = df[(df['one'] == 1) & (df['two']== 1) & (df['three'] == 1)].drop_duplicates()