x.iloc [1] ['x']和x ['x']。iloc [1]有什么区别

时间:2019-01-16 05:58:36

标签: python pandas missing-data

我不能使用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

2 个答案:

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