首页 > 解决方案 > 一个序列的真值是模棱两可的。初学者问题

问题描述

对于具有多列的 pandas 数据框,我需要过滤某些值并在另一列中返回一个值。

例如:

df = { "Strings" : ["string_a", "string_b", "string_b", "string_a"],
       "Integers" : [10, 15, 50, 30]}

df_pd = pd.DataFrame(df)
            
def string_int(x, y) :
    if x == 'string_a':
        return 1
    elif x == 'string_b':
        return 0
    elif y <= 45:
        return 1
    else:
        return 0


df_pd['1_or_0'] = string_int(df_pd['Strings'], df_pd['Intergers'])

我遇到的第一个问题是错误

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

当我尝试实施任何建议的方法时,我会遇到更多错误。

我认为问题在于代码试图比较整个列表而不是元素。

应该有更好的解决方案,但我看不到。

开始学习 python 犯菜鸟错误,但我想更好地理解这个问题。

我知道这个问题已经被多个人提出了,但我从来没有得到一个对我有用的解决方案。

标签: pythonpandasvalueerror

解决方案


您的方法是将系列传递给函数,因此您需要返回一系列(布尔值)

在许多方面,使用条件逻辑更简单。np.where()在这种情况下,我使用级联逻辑来实现您的逻辑。

import numpy as np

df = { "Strings" : ["string_a", "string_b", "string_b", "string_a"],
       "Intergers" : [10, 15, 50, 30]}

df_pd = pd.DataFrame(df)
df_pd = df_pd.assign(**{"1_or_0":lambda dfa: np.where(dfa.Strings.eq("string_a"), 1, 
                                    np.where(dfa.Intergers.le(45),1,0))})
字符串 整数 1_or_0
0 string_a 10 1
1 string_b 15 1
2 string_b 50 0
3 string_a 30 1

推荐阅读