如何设置熊猫数据帧切片的值,其中的行由布尔表达式选择,而列则由位置选择?
到目前为止,我已经通过以下方式做到了:
>>> vals = [5,7]
>>> df = pd.DataFrame({'a':[1,2,3,4], 'b':[5,5,7,7]})
>>> df
a b
0 1 5
1 2 5
2 3 7
3 4 7
>>> df.iloc[:,1][df.iloc[:,1] == vals[0]] = 0
>>> df
a b
0 1 0
1 2 0
2 3 7
3 4 7
这在这个小样本上可以正常工作,但是在我的真实数据帧上给了我以下警告:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
推荐的实现方法是什么?
答案 0 :(得分:2)
使用DataFrame.columns
和DataFrame.loc
:
col = df.columns[1]
df.loc[df.loc[:,col] == vals[0], col] = 0
答案 1 :(得分:1)
一种方法是使用列标题和loc
(基于标签的索引)的索引:
df.loc[df.iloc[:, 1] == vals[0], df.columns[1]] = 0
另一种方法是将np.where
与iloc
(整数位置索引)一起使用,np.where返回行,列索引位置的元组,其中True:
df.iloc[np.where(df.iloc[:, 1] == vals[0])[0], 1] = 0