繁体   English   中英

Select 行,其中多个列值位于多个列表中

[英]Select rows where multiple column values are in multiple lists

我想从 dataframe 中获取 select 值,例如:

    Vendor_1   Vendor_2   Vendor_3
0   1          0          0
1   0          20         0
2   0          0          300
3   4          0          0
4   0          50         0
5   0          0          500 

我想从 Vendor_1、2、3 中保留的值都在一个单独的列表中,即 v_1、v_2、v_3。 例如说 v_1 = [1]、v_2 = [20]、v_3 = [500],这意味着我只想保留这些行。

我试过类似的东西:

df = df[(df['Vendor_1'].isin(v_1)) & (df['Vendor_2'].isin(v_2)) & ... ]

这给了我一个空的 dataframe,这是与上述逻辑有关的问题,还是不存在具有这些约束的行(在我的真实数据框中极不可能)。

干杯

编辑:

好的,所以我已经意识到与我的示例的根本区别以及我的 df 中的实际情况,如果 Vendor_1 有值,则 Vendor_2,3 必须为 0,等等。所以我使用 isin 链的逻辑没有意义正确,我将更新示例 df。

所以我觉得我需要制作 3 个子集,然后合并它们或其他什么?

isin接受字典:

d = {
    'Vendor_1':[1],
    'Vendor_2':[20],
    'Vendor_3':[500]
}

df.isin(d)

Output:

   Vendor_1  Vendor_2  Vendor_3
0      True     False     False
1     False      True     False
2     False     False     False
3     False     False     False
4     False     False     False
5     False     False      True

然后根据您的逻辑,您要检查anyall

df[df.isin(d).any(1)]

Output:

   Vendor_1  Vendor_2  Vendor_3
0         1         0         0
1         0        20         0
5         0         0       500

但是,如果您在这种情况下使用all ,例如,您要求Vendor_1=1Vendor_2=20Vendor_3=500必须发生在相同的行上,并且您将保留这些行。

您给出的示例应该有效,除非实际上没有符合该条件的行。

这些表达式与括号有点棘手,所以我宁愿将行分成两部分以便于调试:

mask = (df['Vendor_1'].isin(v_1)) & (df['Vendor_2'].isin(v_2))

# sanity check that the mask is selecting something
assert mask.any()

df = df[mask]

请注意,由于运算符优先级规则,您必须&之间有括号。

例如:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM