【发布时间】:2017-04-16 10:39:50
【问题描述】:
读完一个excel文件后:
将熊猫导入为 pd
在:
df = pd.read_excel('file.xlsx')
df = df.drop('Unnamed: 0', 1)
df
输出:
A B C D E
0 2345 typeA NO http://www.example.com/...
2 23423 483 NO http://www.example.com/...
3 234234 typeC NO http://www.example.com/...
4 2343 typeA NO http://www.example.com/...
5 23423 typeA NO http://www.example.com/...
6 234 typeA NO http://www.example.com/...
我正在将几个函数应用于在使用 apply() 添加更多列之后创建的几个 pandas 数据框列:
在:
df['E'] = df['D'].apply(checker)
df
输出:
A B C D E
0 2345 typeA NO http://www.example.com/... OK
1 234 483 NO http://www.example.com/... FALSE
2 23423 483 NO http://www.example.com/... OK
3 234234 typeC NO http://www.example.com/... OK
4 2343 typeA NO http://www.example.com/... OK
5 23423 typeA NO http://www.example.com/... FALSE
6 234 typeA NO http://www.example.com/... OK
然后我做了:df = df[df.E == 'OK'] 和 df = df.loc[df.E =='OK']
然后,我正在对上述数据框应用一个新函数:
在:
df['F'] = df['D'].apply(new_function_foo)
虽然它实际上可以按我的意愿工作,但我收到了这个警告:
输出:
/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:10: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
我检查了文档,并尝试按照说明进行操作:
df['F'] = df.loc[['E']].apply(function_foo)
和
df['ColF'] = df.loc[:,'ColE'].apply(function_foo)
但是,我不明白如何解决上述警告。那么,如何正确应用函数呢?
【问题讨论】:
-
这不是警告的来源。在此之前,您可能在代码中的某处创建了 df 的副本。在该行之前查找类似 df2 = df 的内容或类似的内容
-
@StevenG,我忘了说:我做了
df = df[df.E == 'OK'] -
先这样做:
df = df.loc[df.E =='OK'] -
这是一个警告。如果你得到的结果正是你想要的,那没什么大不了的。是这样吗?
标签: python python-3.x pandas numpy