【问题标题】:How to use a conditional statement based on DataFrame boolean value in pandas如何在 pandas 中使用基于 DataFrame 布尔值的条件语句
【发布时间】:2015-09-22 18:10:35
【问题描述】:

现在我知道如何检查数据框中跨多个列的特定值。但是,我似乎无法弄清楚如何根据布尔响应执行 if 语句。

例如:

使用os.walk 遍历目录并将特定文件读入数据帧。

for root, dirs, files in os.walk(main):
        filters = '*specificfile.csv'
        for filename in fnmatch.filter(files, filters):
        df = pd.read_csv(os.path.join(root, filename),error_bad_lines=False)

现在跨多个列检查该数据框。第一个值是列名(column1),下一个值是我在该列(香蕉)中查找的特定值。然后,我正在检查另一列(column2)以获取特定值(绿色)。如果这两个都是真的,我想执行一项特定的任务。但是,如果它是错误的,我想做其他事情。

类似:

if (df['column1']=='banana') & (df['colour']=='green'):
    do something
else: 
    do something

【问题讨论】:

  • 具体任务是什么?是要更新同一行的内容吗?
  • 您是否要检查是否有任何行满足您的 df 或 rows 条件?
  • 我在你的问题中没有看到任何问题。
  • 不,我不想对数据进行任何修改。 google上有很多基于修改数据的理解风格陈述。但我似乎找不到任何一个普通的if。我们可以假设该任务将是一个基于系统的命令动作;以os.makdirs 为例
  • 抱歉 Alex.S 我会修改它以尝试让自己更清楚。我刚刚重读了几次,我可以看到两种形式的问题。 1. 换句话说,“我似乎不知道如何根据布尔响应执行 if 语句。”第二个是代码形式(帖子底部的sn-p)。

标签: python pandas


【解决方案1】:

如果您想检查 DataFrame 的任何一行是否符合您的条件,您可以使用 .any() 以及您的条件。示例 -

if ((df['column1']=='banana') & (df['colour']=='green')).any():

例子-

In [16]: df
Out[16]:
   A  B
0  1  2
1  3  4
2  5  6

In [17]: ((df['A']==1) & (df['B'] == 2)).any()
Out[17]: True

这是因为您的条件 - ((df['column1']=='banana') & (df['colour']=='green')) - 返回一系列真/假值。

这是因为在 pandas 中,当您将系列与标量值进行比较时,它会返回将该系列的每一行与标量值进行比较的结果,结果是一系列 True/False 值,表示比较的结果具有标量值的那一行。示例 -

In [19]: (df['A']==1)
Out[19]:
0     True
1    False
2    False
Name: A, dtype: bool

In [20]: (df['B'] == 2)
Out[20]:
0     True
1    False
2    False
Name: B, dtype: bool

& 为这两个系列逐行执行and。示例 -

In [18]: ((df['A']==1) & (df['B'] == 2))
Out[18]:
0     True
1    False
2    False
dtype: bool

现在要检查该系列中的任何值是否为True,您可以使用.any(),要检查该系列中的所有值是否为True,您可以使用.all()

【讨论】:

  • 太好了,谢谢 Anand S Kumar。我能问一下你是怎么解决的吗?我没有在文档中看到任何解释
  • 用一个小解释更新答案。
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 2021-06-25
  • 2018-09-20
  • 2012-03-30
  • 1970-01-01
  • 2015-05-12
  • 2017-04-12
  • 2019-04-10
相关资源
最近更新 更多