2017-02-09 21 views
2

我有以下的數據幀DF:正確的方式使用ILOC在熊貓

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

可以使用Index.get_locTaste柱的位置,因爲DataFrame.iloc選擇的位置:在大熊貓的下一個版本不建議,因爲deprecate ix

#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可能的解決方案:

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 
4

。 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' 

+0

不客氣,希望它有助於一點點。 –

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]