Pandas: 替换值时如何引用行值

Pandas: How to refer to the row value while replacing a value

我想做的是根据行值替换一个值。 但我不知道该怎么做。代码如下。

def get_new_value_b(db, value_a):
    # Take a value_a and return value_b
    ...


a_list = ["a", "b", "c"]
df.loc[df["value_a"] in a_list, "value_b"] = get_new_value_b(db,df["value_a"]) 

这里我想做的是如果值存在于a_list中就替换一个value_a 但是在条件上,出现了错误。

Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

此外,如果条件为真,我想通过将 value_a 传递给函数 (get_new_value_b) 来获取新值 但似乎它也指的是整个列,而不是行中的特定值。

我该如何解决这个问题?

使用Series.isin and Series.apply:

df.loc[df["value_a"].isin( a_list), "value_b"] = df["value_a"].apply(get_new_value_b)

最好是只对匹配的行调用函数:

df = pd.DataFrame({"value_a":  ["a" ,"b" ,"d" ,"f","c" ]})

def get_new_value_b(value_a):
    # Take a value_a and return value_b    
    return '_' + value_a

a_list = ["a", "b", "c"]
m = df["value_a"].isin( a_list)
df.loc[m, "value_b"] = df.loc[m, "value_a"].apply(get_new_value_b)
print (df)
  value_a value_b
0       a      _a
1       b      _b
2       d     NaN
3       f     NaN
4       c      _c

编辑:如果需要传递多个参数,请使用 lambda 函数:

m = df["value_a"].isin( a_list)
df.loc[m, "value_b"] = df.loc[m, "value_a"].apply(lambda x: get_new_value_b(df1, x))