我有一个包含26列的CSV文件。我试图找到某些文本,以便获得我需要的信息。这两列是“姓氏”,“名字”。
我在这里找到了这段代码,但我得不到我需要的东西。
dframe['First Name'].where(dframe['Last Name']="James","Turner")
我收到错误: SyntaxError:keyword不能是表达式
然后我尝试了第一个名字:
dframe['Last Name']=="Turner"
我得到659.000行的布尔值为False。
答案 0 :(得分:1)
dframe['Last Name'] == 'Turner'
上面的行生成pandas.Series
个布尔项,表示'Last Name'
列中的每个条目是否与'Turner'
匹配
您可以使用pandas.Series
布尔项来索引数据帧:
dframe[dframe['Last Name'] == 'Turner']
这应该为您提供所需的行选择。
现在,如果您只想查看所选行的'First Name'
,您可以
dframe[dframe['Last Name'] == 'Turner']['First Name']
如果要对名字和姓氏进行复合搜索,则需要在单个搜索结果之间执行按位布尔运算:
dframe[(dframe['First Name'] == 'John') & (dframe['Last Name'] == 'Turner')]
最后,为了给你一点奖励,如果你想找到包含'Turner'
的所有姓氏,比如'Turner-Jones'
,你可以执行以下操作:
dframe[dframe['Last Name'].str.contains('Turner')]
在上面的一行中,您使用.str
上的pandas.Series
访问者,这样您就可以访问一组非常方便的字符串方法。您可以在documentation中详细了解相关信息。
下面我将展示一个来自IPython会话的工作示例:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: first_names = ['John', 'Tom', 'Fred', 'Michael', 'Andrew']
In [4]: last_names = ['Turner', 'Harden', 'Bryant', 'Davis', 'Turner']
In [5]: df = pd.DataFrame(list(zip(first_names, last_names)), columns=['First Na
me', 'Last Name'])
In [6]: df
Out[6]:
First Name Last Name
0 John Turner
1 Tom Harden
2 Fred Bryant
3 Michael Davis
4 Andrew Turner
In [7]: df[df['Last Name'] == 'Turner']
Out[7]:
First Name Last Name
0 John Turner
4 Andrew Turner
In [8]: df[(df['First Name'] == 'John') & (df['Last Name'] == 'Turner')]
Out[8]:
First Name Last Name
0 John Turner
In [9]: df[df['Last Name'].str.contains('r')]
Out[9]:
First Name Last Name
0 John Turner
1 Tom Harden
2 Fred Bryant
4 Andrew Turner
In [10]: (df['Last Name'] == 'Turner').any()
Out[10]: True
请注意,在标记为In[10]
的输入中,我继续通过调用布尔any()
上的pandas.Series
方法验证是否存在任何匹配。如果您在获得预期结果时遇到问题,这可能是调试搜索的有用方法。
答案 1 :(得分:0)
尝试使用如下的.isin()。
dframe[dframe['Last Name'].isin(['James', 'Turner'])]
pandas.DataFrame.isin 返回boolean DataFrame,显示DataFrame中的每个元素是否包含在值中。 (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html)