使用函数更新pandas数据框中的多个列

时间:2017-07-24 00:09:45

标签: python pandas dataframe indexing

我已尝试在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( )。','发生在索引......')

1 个答案:

答案 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