Python 相当于 excel 嵌套 if 用于过滤 Pandas DataFrame 行的条件

标签 python pandas dataframe

使用 python 选择特定的 excel 行。所以在 excel 中我会做

If(And(Or(A<>({"Closed",""}),Or(B<>({"Closed",""})))

用于获取数据框中既非 Closed 也非空白的列。尝试使用

df = df[(~df.A.isin([Closed","No Data"])) &(~df.B.isin([Closed","No Data"]))]

问题是 python 正在删除列,例如:

A                        B
Approved       Closed
No Data          Restrict
Restrict           No Data

我不想要 正如其中一个链接中所建议的那样,也尝试过

df.loc[(df[A] != "Closed") & (df[B] != "Closed") & (df[A] != "No data") & (df[B] != "No data")

得到与我尝试 .isin 时相同的结果

最佳答案

我将使用此示例数据:

           A         B  ~df.A.isin  ~df.B.isin  ~A & ~B  ~A | ~B
0     Closed    Closed       False       False    False    False
1     Closed   No Data       False       False    False    False
2   Approved    Closed        True       False    False     True
3    No Data   No Data       False       False    False    False
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True

~df.A.isin列显示 ~df.A.isin(["Closed","No Data"]) 的值,即 True对于 A 既不包含 Closed 的行也不No Data

~df.B.isin列显示 ~df.B.isin(["Closed","No Data"]) 的值,即 True对于 B 既不包含 Closed 的行也不No Data

~A & ~B列显示 (~df.A.isin(["Closed","No Data"])) &(~df.B.isin(["Closed","No Data"])) 的值

~A | ~B列显示 (~df.A.isin(["Closed","No Data"])) |(~df.B.isin(["Closed","No Data"])) 的值

您第一次尝试缺少 "Closed"的开头.添加它我们有

df[(~df.A.isin(["Closed","No Data"])) &(~df.B.isin(["Closed","No Data"]))]

这给了我们:

           A         B  ~df.A.isin  ~df.B.isin  ~A & ~B  ~A | ~B
8   Approved  Approved        True        True     True     True
11  Restrict  Approved        True        True     True     True

结果只显示那些完全没有 Closed 的行没有 No Data .

文本评论中的建议:

df[(~df.A.isin(["Closed","No Data"])) |(~df.B.isin(["Closed","No Data"]))]

给我们:

           A         B  ~df.A.isin  ~df.B.isin  ~A & ~B  ~A | ~B
2   Approved    Closed        True       False    False     True
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True

这里我们有| ( or ) 而不是 & ( and ),因此行可以包含 ClosedNo Data ,但不在 A 和 B 中。这意味着具有以下行:

       A         B
Approved    Closed
 No Data  Restrict
Restrict   No Data

将包括在内,但具有以下内容的行:

     A         B
Closed    Closed
Closed   No Data

你的第二次尝试:

df.loc[(df[A] != "Closed") & (df[B] != "Closed") &
       (df[A] != "No data") & (df[B] != "No data")

需要在列标签周围加上引号。您可以使用 df.Adf['A'] , 但不是 df[A]

此外,您拼写了 dataNo data小写 d , 而在其他地方你用大写 D - No Data .在 python 中,这是不一样的。如果我们解决这个问题:

df.loc[(df['A'] != "Closed") & (df['B'] != "Closed") &
       (df['A'] != "No Data") & (df['B'] != "No Data")]

这给了我们与第一次尝试相同的结果:

           A         B  ~df.A.isin  ~df.B.isin  ~A & ~B  ~A | ~B
8   Approved  Approved  True  True  True  True  True  True  True
11  Restrict  Approved  True  True  True  True  True  True  True

如果稍微重新排列此表达式,请使用括号和 | ( or ):

df.loc[((df['A'] != "Closed") & (df['A'] != "No Data")) | 
       ((df['B'] != "Closed") & (df['B'] != "No Data"))]

我们得到:

           A         B  ~df.A.isin  ~df.B.isin  ~A & ~B  ~A | ~B
2   Approved    Closed        True       False    False     True
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True

关于Python 相当于 excel 嵌套 if 用于过滤 Pandas DataFrame 行的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55284261/

相关文章:

python / Pandas : Calculation based on cell value

python - 如何在 Django Serializer 中高效更新嵌套对象

python - 按百/个对列表进行排序

python - 将单元格中的多个值转换为列

python - 如何尽可能长时间地向上移动特定列中的值?

使用 dplyr 的 R 滤波器矩阵

python - 与 Timedelta 的时间差给出错误的结果

python - 显示 pygame 单元测试

python - Pandas - 多列到 "column name - value"列

python - 使用不同的 DataFrame 更改 pandas DataFrame 切片中的值