首页 > 解决方案 > 如何提取具有混合值的行

问题描述

我必须从熊猫数据框中提取具有“出生日期”列中的值的行,这些值出现在带有日期的列表中。

import pandas as pd

df = pd.DataFrame({'Name': ['Jack', 'Mary', 'David', 'Bruce', 'Nick', 'Mark', 'Carl', 'Sofie'],
                  'Date of birth': ['1973', '1999', '1995', '1992/1991', '2000', '1969', '1994', '1989/1990']})

dates = ['1973', '1992', '1969', '1989']

new_df = df.loc[df['Date of birth'].isin(dates)]

print(new_df)
0   Jack          1973
1   Mary          1999
2  David          1995
3  Bruce     1992/1991
4   Nick          2000
5   Mark          1969
6   Carl          1994
7  Sofie     1989/1990

最终我得到了下表。如您所见,Bruce 和 Sofie 的行不存在,因为该值后面跟着 / 和另一个值。我应该如何将这两个分开过滤掉?

   Name Date of birth
0  Jack          1973
5  Mark          1969

标签: pythonpandasdataframe

解决方案


您可以使用str.contains

import pandas as pd

df = pd.DataFrame({'Name': ['Jack', 'Mary', 'David', 'Bruce', 'Nick', 'Mark', 'Carl', 'Sofie'],
                   'Date of birth': ['1973', '1999', '1995', '1992/1991', '2000', '1969', '1994', '1989/1990']})

dates = ['1973', '1992', '1969', '1989']

new_df = df.loc[df['Date of birth'].str.contains(rf"\b{'|'.join(dates)}\b")]

print(new_df)

输出

    Name Date of birth
0   Jack          1973
3  Bruce     1992/1991
5   Mark          1969
7  Sofie     1989/1990

该字符串rf"\b{'|'.join(dates)}\b"是一个正则表达式模式,它将匹配包含任何日期的任何字符串。


推荐阅读