sup*_*aee 5 python match dataframe pandas
我有以下数据帧df:
print(df)
Food Taste
0 Apple NaN
1 Banana NaN
2 Candy NaN
3 Milk NaN
4 Bread NaN
5 Strawberry NaN
Run Code Online (Sandbox Code Playgroud)
我试图使用iloc替换行范围内的值:
df.Taste.iloc[0:2] = 'good'
df.Taste.iloc[2:6] = 'bad'
Run Code Online (Sandbox Code Playgroud)
但是它返回了以下SettingWithCopyWarning消息:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
Run Code Online (Sandbox Code Playgroud)
所以,我找到了这个Stackoverflow页面并尝试了这个:
df.iloc[0:2, 'Taste'] = 'good'
df.iloc[2:6, 'Taste'] = 'bad'
Run Code Online (Sandbox Code Playgroud)
不幸的是,它返回了以下错误:
ValueError: Can only index by location with a [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array]
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用iloc的正确方法是什么?另外,有没有办法将上面这两行结合起来?
您可以使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
.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'
Run Code Online (Sandbox Code Playgroud)
等于:
df.iloc[0:2, 1] = 'good'
df.iloc[2:6, 1] = 'bad'
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下.
| 归档时间: |
|
| 查看次数: |
27756 次 |
| 最近记录: |