我不能使用x.iloc [1] ['x'] = 16将np.nan的值更改为16,但是可以使用x ['x']。iloc [1] = 16来更改它。为什么?这两个表达式有什么区别?
x = pd.DataFrame({'x': [1, np.nan, 3], 'y': [3, 4, 5]})
x.iloc[1]['x']=16
print(x.iloc[1]['x'])
nan
x['x'].iloc[1]=16
print(x.iloc[1]['x'])
16.0
答案 0 :(得分:1)
如评论中所述,不能保证您的任何替代方法都能正常工作。 documentation解释了原因和理由。
一个事实起作用而另一个不起作用的事实不值得调查,因为这些是易于更改的实现细节。
对于标量,应使用iat
设置值通过整数位置或at
通过标签。
iat
用于按整数位置进行标量设置x.iat[1, x.columns.get_loc('x')] = 16
at
用于按标签设置标量x.at[x.index[1], 'x'] = 16
如果您的数据框索引是常规pd.RangeIndex
,则可以简化最后的分配:
x.at[1, 'x'] = 16
答案 1 :(得分:0)
欢迎Stackoverflow 评论中提供的答案清晰而充分。
iloc是一个很棒的工具,如果您想以自己想要的方式使用它,我将添加一下,您必须首先传递要在其上选择行的列。循环遍历数据框以更改值的示例:
import pandas as pd
d = {'col1': [1, 2,'np.nan',4,5], 'col2': ['A','B','C','D','E']}
df = pd.DataFrame(data=d)
col1 col2
0 1 A
1 2 B
2 np.nan C
3 4 D
4 5 E
for i in range(len(df)):
if df['col1'].iloc[i] == "np.nan":
df['col1'].iloc[i] = 16
print(df)
col1 col2
0 1 A
1 2 B
2 16 C
3 4 D
4 5 E