我需要在某些条件下对某些列上的行进行过滤。 这些列显示在列表中。所有列的条件都相同,也可以不同。对于我的工作,条件是相同的。
不起作用
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)
我了解错误的原因。有什么办法可以通过修改不起作用的代码来构造条件?
答案 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()