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