【问题标题】:Value errors (invalid literal and truth value ambigous) in a data frame IF statement数据帧 IF 语句中的值错误(无效文字和真值不明确)
【发布时间】:2022-01-11 06:37:18
【问题描述】:

尝试查看类似的问题 (ValueError: The truth value of a DataFrame is ambiguous),但答案出乎我的意料,我是在 IF 语句不起作用的上下文中询问的,并且在将字符串转换为我的数字时出现问题

我正在尝试对数据表的一行进行验证。标准是找到type等于'employees-full-time'并且value(这是我需要转换为数字值的字符串)大于或等于min_value的行。

我无法让它工作。以下是我的问题和错误的详细信息:

数据框数据类型

category       object
type           object
value          object
value_type     object
mandatory        bool
min_value     float64

脚本

# validate full time employees value
if df.loc[(df['type'] == 'employees-full-time') & (df['value'].astype(int) >= df['min_value'])]:
    print('full time employees cool')
else:
    print('full time employees not so cool')

错误

ValueError: invalid literal for int() with base 10: 'true'

如果我减少脚本以排除第二个条件,它会抱怨:

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

感谢您的宝贵时间

【问题讨论】:

  • @esqew 我试过那个,但我一点也不明白
  • 'true' 不能转换为 int,因为它不是整数。布尔值True 可以转换为整数(0 或 1),因为布尔值是二进制的,而不是字符串。因此,请检查您的数据以确保它对您正在尝试做的事情有意义。第二个错误是因为您询问if ... 并提供数据框作为输出。没有我认为您期望的逐行操作输出,它不会占用每一行并通过if 运行它。您可以创建一个新列来查找哪些为真,或者如果条件为真,则使用df.any(),对所有都相同
  • @fam-woodpecker 感谢您的帮助,df['value'] 是存储在字符串对象中的数字。 "6" 但 min_value 是一个浮点数。我试图找到type == employees-full-time 的行,并将字符串值 6 视为一个数字,以确保提交的数字大于或等于min_value。我想要的结果是条件上的真或假
  • 当我为测试创建列时df['test'] = np.where(df['type'] == 'employees-full-time') & (df['value'] == '6') 工作正常,但这只是因为我将字符串对象与硬编码为“6”的字符串值进行了比较。在这种情况下,我需要 value 将其视为浮点数,并与同一行中已经是浮点数的另一个值进行比较

标签: python


【解决方案1】:

我必须先隔离数据框记录,然后才能根据行中的参数对其进行验证。然而,我担心的是,由于起源是基于一组动态的值,它可能会成倍增长。在不影响性能的情况下,多少数据帧可以正常工作?我在想,一个数组中可能有 300 个动态对象,它们最终会出现在它们自己的数据框中。 我想避免这种情况的方法是逐行验证数据框,所以,也许 for 循环更好?

# validate full time employees value
employee_full_time = df.loc[df['type'] == 'employees-full-time'].copy()
if (employee_full_time['value'].astype(float) < 
employee_full_time['min_value']).all():
    print('Invalid employee full time value')
else:
    print('Value of Full time employees is valid')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2019-08-13
    • 1970-01-01
    • 2021-05-28
    • 2018-08-31
    • 1970-01-01
    • 2020-02-12
    • 2021-03-04
    相关资源
    最近更新 更多