【问题标题】:For Loop and The truth value of a Series is ambiguousFor循环和一个系列的真值是不明确的
【发布时间】:2020-08-11 19:28:32
【问题描述】:

在这里查看了类似查询的答案,但仍不确定。下面的代码产生:

     for i in range(len(df)):
            if df[0]['SubconPartNumber1'].str.isdigit() == False :
                df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(',', '/', regex = True)
                df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(r"\(.*\)-", '/', regex = True)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

  • 您能否发布与某些行中相同的数据框示例以及 df[0] 是如何工作的,或者您将 0 作为列,否则您将因此而出现关键错误。作为解决方案,您可以使用应用功能

标签: python pandas series valueerror


【解决方案1】:

替换这个:

if df[0]['SubconPartNumber1'].str.isdigit() == False :

用这个:

if df[0]['SubconPartNumber1'].str.isdigit().empty:

除了empty之外还有其他方法,但我认为这会得到你想要的。

【讨论】:

  • 答案明显错误,==False是invert mask或者boolean,.empty是test empty Series,DataFrame,所以这里用没有意义。
  • 很明显,您阅读了 OP 得到的错误,该错误明确指出要使用 .empty 方法?你测试了吗?
【解决方案2】:

如果可能,您可以在 pandas 中avoid loops。您的解决方案应由boolean mask 替换为~ 用于反转而不是== False 并传递给DataFrame.loc

m = df['SubconPartNumber1'].str.isdigit()
df.loc[~m, 'SubconPartNumber1'] = df.loc[~m, 'SubconPartNumber1'].str.replace(',', '/', regex = True).str.replace(r"\(.*\)-", '/', regex = True)

但是因为 numeric 只有数字,所以我认为这里不需要掩码,对于or,也应该通过| 加入正则表达式,regex=True 是默认参数,所以应该省略:

df = pd.DataFrame({'SubconPartNumber1':['345','aaa,','(bbb)-ccc']})
print (df)
  SubconPartNumber1
0               345
1              aaa,
2         (bbb)-ccc

df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(r",|\(.*\)-", '/')
print (df)
  SubconPartNumber1
0               345
1              aaa/
2              /ccc

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    相关资源
    最近更新 更多