繁体   English   中英

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

[英]How do I compare list values to a dataframe column that are not exactly equal?

我是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循环中获得正确的语法。

您可以执行以下操作:

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)

只是为了补充@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内部的额外参数传递。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM