如何在 pandas 数据框的列中搜索特定文本

lin*_*ire 1 python-3.x pandas

我有一个包含 26 列的 CSV 文件。我正在尝试查找某些文本,以便获得我需要的信息。两列是“姓氏”、“名字”。

我在这里找到了这段代码,但我没有得到我需要的东西。

dframe['First Name'].where(dframe['Last Name']="James","Turner")
Run Code Online (Sandbox Code Playgroud)

我收到错误:SyntaxError:关键字不能是表达式

然后我只尝试了名字:

dframe['Last Name']=="Turner"
Run Code Online (Sandbox Code Playgroud)

我得到 659.000 行的布尔值 False。

Ped*_*rte 5

dframe['Last Name'] == 'Turner' 
Run Code Online (Sandbox Code Playgroud)

上面的行生成一个pandas.Series布尔值项,表示是否每个条目都在'Last Name'布尔值项,表示列'Turner'

您可以使用pandas.Series布尔项来索引数据框:

dframe[dframe['Last Name'] == 'Turner']
Run Code Online (Sandbox Code Playgroud)

这应该会为您留下所需的行选择。


现在,如果您只想查看'First Name'所选行的 ,您可以这样做

dframe[dframe['Last Name'] == 'Turner']['First Name']
Run Code Online (Sandbox Code Playgroud)


如果要对名字和姓氏进行复合搜索,则需要在各个搜索结果之间执行按位布尔运算:

dframe[(dframe['First Name'] == 'John') & (dframe['Last Name'] == 'Turner')]
Run Code Online (Sandbox Code Playgroud)


最后,给你一点好处,如果你想找到所有包含 的姓氏'Turner',比如'Turner-Jones',你可以执行以下操作:

dframe[dframe['Last Name'].str.contains('Turner')] 
Run Code Online (Sandbox Code Playgroud)

在上面的行中,您使用了 的.str访问器pandas.Series,这使您可以访问一组非常方便的字符串方法。您可以在文档中阅读更多相关信息。


下面我展示了 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
Run Code Online (Sandbox Code Playgroud)

请注意,在标记的输入中,In[10]我继续通过调用any()boolean 上的方法来验证是否有任何匹配项pandas.Series。如果您在获取预期结果时遇到问题,这可能是调试搜索的有用方法。