如何将列表值与不完全相等的数据框列进行比较?

时间:2019-05-24 19:07:13

标签: python pandas

我是Python的新手,我正尝试使用Pandas清理csv。

我当前的数据框如下:

   Time   Summary
0  10     ABC Company
1  4      Company XYZ
2  20     The Awesome Company
3  4      Record B

我有一个看起来像这样的列表:

clients = ['ABC', 'XYZ', 'Awesome']

我面临的挑战是从数据框中提取等于列表中任何值的值。

我希望数据框看起来像这样:

   Time   Summary              Client
0  10     ABC Company          ABC
1  4      Company XYZ          XYZ
2  20     The Awesome Company  Awesome
3  4      Record B             NaN

我已经研究了正则表达式,.any和in,但是我似乎无法在for循环中获得正确的语法。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

import numpy as np


def match_client(summary):
    client_matches = [client for client in ['ABC', 'XYZ', 'Awesome'] if client in summary]
    if len(client_matches) == 0:
        return np.nan
    else:
        return ', '.join(client_matches)

df['Client'] = df['Summary'].map(match_client)

答案 1 :(得分:0)

只需补充@Simon的答案,如果您想将其应用于其他客户,也可以将客户列表作为参数传递。

import numpy as np

def match_client(summary, clients):
    client_matches = [client for client in clients if client in summary]
    if len(client_matches) == 0:
        return np.nan
    else:
        return ', '.join(client_matches)

clients = ['ABC', 'XYZ', 'Awesome']
df['Client'] = df['Summary'].map(lambda x: match_client(x, clients))

您只需要使用lambda函数,就可以在clients内将map作为附加参数传递。

答案 2 :(得分:0)

pandas.Series.str.extract

假设只有一场比赛

df.assign(Client=df.Summary.str.extract(f"({'|'.join(clients)})"))

   Time              Summary   Client
0    10          ABC Company      ABC
1     4          Company XYZ      XYZ
2    20  The Awesome Company  Awesome
3     4             Record B      NaN

pandas.Series.str.findall

可能还有更多……你永远不会知道。

df.join(df.Summary.str.findall('|'.join(clients)).str.join('|').str.get_dummies())

   Time              Summary  ABC  Awesome  XYZ
0    10          ABC Company    1        0    0
1     4          Company XYZ    0        0    1
2    20  The Awesome Company    0        1    0
3     4             Record B    0        0    0