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))
我想做的是根据行值替换一个值。 但我不知道该怎么做。代码如下。
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))