在 Pandas 中使用 iloc 的正确方法

新手上路,请多包涵

我有以下数据框 df:

 print(df)

    Food         Taste
0   Apple        NaN
1   Banana       NaN
2   Candy        NaN
3   Milk         NaN
4   Bread        NaN
5   Strawberry   NaN

我正在尝试使用 iloc 替换一系列行中的值:

 df.Taste.iloc[0:2] = 'good'
df.Taste.iloc[2:6] = 'bad'

但它返回了以下 SettingWithCopyWarning 消息:

 SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

所以,我找到了这个 Stackoverflow 页面 并尝试了这个:

 df.iloc[0:2, 'Taste'] = 'good'
df.iloc[2:6, 'Taste'] = 'bad'

不幸的是,它返回了以下错误:

 ValueError: Can only index by location with a [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array]

在这种情况下使用 iloc 的正确方法是什么?另外,有没有办法将上面的这两行结合起来?

原文由 Henry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 843
2 个回答

您可以使用 Index.get_loc 列的位置 Taste ,因为 DataFrame.iloc 按位置选择:

 #return second position (python counts from 0, so 1)
print (df.columns.get_loc('Taste'))
1

df.iloc[0:2, df.columns.get_loc('Taste')] = 'good'
df.iloc[2:6, df.columns.get_loc('Taste')] = 'bad'
print (df)
         Food Taste
0       Apple  good
1      Banana  good
2       Candy   bad
3        Milk   bad
4       Bread   bad
5  Strawberry   bad

不推荐使用 ix 的可能解决方案,因为在下一版本的 pandas 中 弃用 ix

 df.ix[0:2, 'Taste'] = 'good'
df.ix[2:6, 'Taste'] = 'bad'
print (df)
         Food Taste
0       Apple  good
1      Banana  good
2       Candy   bad
3        Milk   bad
4       Bread   bad
5  Strawberry   bad

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

.iloc 使用整数位置,而 .loc 使用名称。这两个选项也都采用行和列标识符(对于 DataFrame)。您的初始代码不起作用,因为您没有在 .iloc 调用中指定您选择的列。您尝试的第二行代码不起作用,因为您将整数位置与列名混合在一起,而 .iloc 只接受整数位置。如果您不知道列整数位置,可以按照上面的建议使用 Index.get_loc 代替。否则,使用整数位置,在本例中为 1。

 df.iloc[0:2, df.columns.get_loc('Taste')] = 'good'
df.iloc[2:6, df.columns.get_loc('Taste')] = 'bad'

等于:

 df.iloc[0:2, 1] = 'good'
df.iloc[2:6, 1] = 'bad'

在这种特殊情况下。

原文由 jsxgd 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题