我已尝试在Stack Overflow上搜索此内容,但似乎无法找到相同的方案。我正在尝试使用相同的功能在一行代码中更新我的pandas数据帧中的多个列。我可以单独更新每个列,但希望该函数同时更新多个列。
该功能是基本的:
binary_values = lambda x: 0 if x == -99 else 1
我知道我可以将标量值分配给数据帧的各个部分,如下所示:
df.ix[:,22:26] = 1
我正在尝试做类似下面的事情:
df.ix[:,22:26] = df.ix[:,22:26].apply(binary_values)
...但它抛出了ValueError :('系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all( )。','发生在索引......')
答案 0 :(得分:1)
您的lambda
函数未进行矢量化,您需要applymap
将其应用于数据框的每个元素:
df.iloc[:,22:26] = df.iloc[:,22:26].applymap(binary_values)
实施例:
df = pd.DataFrame({
"A":[1,2,3,-99,5,3],
"B":[2,3,5,2,-99,2],
"C":[-99,3,2,1,4,5]
})
binary_values = lambda x: 0 if x == -99 else 1
df.iloc[:,1:] = df.iloc[:,1:].applymap(binary_values)
df
# A B C
#0 1 1 0
#1 2 1 1
#2 3 1 1
#3 -99 1 1
#4 5 0 1
#5 3 1 1
更简单(矢量化)选项检查相等性,然后将数据类型转换为int:
df.iloc[:,1:] = df.iloc[:,1:].ne(-99).astype(int)
df
# A B C
#0 1 1 0
#1 2 1 1
#2 3 1 1
#3 -99 1 1
#4 5 0 1
#5 3 1 1