在Pandas

时间:2017-02-09 14:43:35

标签: python pandas dataframe match

我有以下数据框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 page并尝试了这个:

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的正确方法是什么?另外,有没有办法将上面这两行结合起来?

4 个答案:

答案 0 :(得分:8)

您可以使用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中有deprecate 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

答案 1 :(得分:6)

.iloc使用整数位置,而.loc使用name。这两个选项还同时采用行和列标识符(对于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'

在这种特殊情况下。

答案 2 :(得分:0)

纯粹基于整数位置的索引,用于按位置选择..例如: -

lang_sets = {}
lang_sets['en'] = train[train.lang == 'en'].iloc[:,:-1]
lang_sets['ja'] = train[train.lang == 'ja'].iloc[:,:-1]
lang_sets['de'] = train[train.lang == 'de'].iloc[:,:-1]

答案 3 :(得分:0)

在这种情况下,我更喜欢使用.loc,并且如果要在位置上进行选择,则显式使用DataFrame的索引:

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