【问题标题】:How to iterate through a data frame and for every row of that data frame, perform some actions?如何遍历数据框并对该数据框的每一行执行一些操作?
【发布时间】:2019-09-07 22:58:54
【问题描述】:

我有一个场景,我在 CSV 文件中有一些数据,我需要遍历每一行并查找是否找到特定值。如果找到,则执行一项操作,否则执行另一项操作。

这是我使用的数据集:

import pandas as pd

dataset = pd.read_csv('Teams\India.csv')

Ind = 0 SA = 0

if(dataset.loc[(dataset['Opponent']) == 'South Africa' & (dataset['Result']) == 'Won']): Ind = Ind + 1 else: SA = SA + 1

根据我的 CSV 文件,印度与南非打了 6 场比赛,赢了 5 场。所以,最后'Ind'的值必须是5,'SA'的值必须是1。

但是当我尝试运行此代码时,无论我做什么,都会收到以下错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]

【问题讨论】:

  • 您还可以将您拥有的示例数据集作为文本发布吗?以获得更好的参考。谢谢
  • @anky_91,我已按照您的要求发布了数据集。

标签: python-3.x pandas csv dataframe for-loop


【解决方案1】:

看起来你可以一口气完成:

Ind = ((dataset['Opponent'] == 'South Africa') & (dataset['Result'] == 'Won')).sum()
SA = len(dataset) - Ind

【讨论】:

  • 非常感谢您的回复!但是有一个小问题。它正在工作,但它只生成一个值为 5 而不是 2 个变量的变量 Ind。我不知道为什么!
  • 两个命令都运行了吗?试试print(Ind, SA)看看有没有错误?
  • 成功了!我刚刚用Sa替换了SA,它开始正常工作。 IDK 为什么!
【解决方案2】:

您尝试执行的操作将不起作用,因为 loc 将返回您的条件为 True 的所有行。它们不会自动迭代。

对于您要执行的操作,没有必要使用 iterrows 或 if 语句。

试试这个:

Ind = dataset.loc[(dataset['Opponent'] == 'South Africa') & (dataset['Result'] == 'Won')].shape[0]

SA = dataset.loc[(dataset['Opponent'] != 'South Africa') | (dataset['Result'] != 'Won')].shape[0]

这样会比使用for loop更快

【讨论】:

    【解决方案3】:

    你需要 if( (condition1 == x) & (condition2 == y)): ...

    你还需要一些循环,比如

    for row in data:
     if...:
      counter += 1
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2019-11-24
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多