Pandas:无法基于字符串相等性进行过滤

20

我使用python 2.7和OSX操作系统,在pandas 0.16.2版本上读取csv文件中的数据如下:

import pandas as pd

data = pd.read_csv("my_csv_file.csv",sep='\t', skiprows=(0), header=(0))
< p > data.dtypes 的输出结果为:

name       object
weight     float64
ethnicity  object
dtype: object

我原以为姓名和种族的类型应该是字符串类型,但在 Stack Overflow 上找到了关于为什么它们在新版本的 pandas 中是“对象”的原因。

现在,我想根据种族选取行,例如:

data[data['ethnicity']=='Asian']
Out[3]: 
Empty DataFrame
Columns: [name, weight, ethnicity]
Index: []

我使用 data[data.ethnicity=='Asian'] 或者 data[data['ethnicity']=="Asian"] 可以得到相同的结果。

但是当我尝试以下代码:

data[data['ethnicity'].str.contains('Asian')].head(3)

我得到了我想要的结果。

然而,我不想使用"contains",我想检查直接相等性。

请注意,data[data['ethnicity'].str=='Asian']会引发错误。

我做错了什么吗?如何正确地做到这一点?


你的数据框中可能没有该值,这就是为什么它失败的原因,你确定你有完全相同的字符串吗? - EdChum
你的字符串数据是否包含一些前导和尾随的空白字符? - Jianxun Li
1
发布 data.loc[data['ethnicity'].str.contains('Asian'), 'ethnicity'].head(3).tolist()。它会帮助您查看字符串中是否有空格。 - unutbu
以下是程序相关的内容翻译,英文转中文。请仅返回翻译后的文本:两个答案都是正确的,它们解决了我的问题。结果是由于空格导致的。在两个正确答案之间做出选择很困难。最终我选择了更加详细的答案标记为正确答案。希望这没有问题。就像抛硬币一样难以决定。 - vpk
2个回答

22

你的字符串中可能包含空格,例如:

data = pd.DataFrame({'ethnicity':[' Asian', '  Asian']})
data.loc[data['ethnicity'].str.contains('Asian'), 'ethnicity'].tolist()
# [' Asian', '  Asian']
print(data[data['ethnicity'].str.contains('Asian')])

产量
  ethnicity
0     Asian
1     Asian

要去掉字符串开头或结尾的空格,您可以使用

data['ethnicity'] = data['ethnicity'].str.strip()

之后,
data.loc[data['ethnicity'] == 'Asian']

产出。
  ethnicity
0     Asian
1     Asian

5
你可以尝试这个:
data[data['ethnicity'].str.strip()=='Asian']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接