Python 如何将列表值与不完全相等的dataframe列进行比较?
我是Python新手,我正在尝试使用Pandas清理csv 我当前的数据帧如下所示:Python 如何将列表值与不完全相等的dataframe列进行比较?,python,pandas,Python,Pandas,我是Python新手,我正在尝试使用Pandas清理csv 我当前的数据帧如下所示: 时间摘要 0 10 ABC公司 14 XYZ公司 2.20令人敬畏的公司 3.4记录B 我有一个列表,看起来像: clients=['ABC','XYZ','Awesome'] 我面临的挑战是从数据帧中提取与列表中的任何值相等的值 我希望我的数据框如下所示: 时间摘要客户端 0 10 ABC公司ABC 14公司XYZ XYZ 2.20令人敬畏的公司令人敬畏 3 4记录B NaN 我已经研究了regex、.
时间摘要
0 10 ABC公司
14 XYZ公司
2.20令人敬畏的公司
3.4记录B
我有一个列表,看起来像:
clients=['ABC','XYZ','Awesome']
我面临的挑战是从数据帧中提取与列表中的任何值相等的值
我希望我的数据框如下所示:
时间摘要客户端
0 10 ABC公司ABC
14公司XYZ XYZ
2.20令人敬畏的公司令人敬畏
3 4记录B NaN
我已经研究了regex、.any和in,但我似乎无法在for循环中获得正确的语法。您可以执行以下操作:
将numpy导入为np
def匹配_客户端(摘要):
client_matches=[客户端对客户端在['ABC','XYZ','Awesome']中,如果客户端在摘要中]
如果len(客户端_匹配)==0:
返回np.nan
其他:
返回“,”.join(客户端匹配)
df['Client']=df['Summary'].map(匹配客户端)
为了补充@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函数,就可以将客户机
作为一个额外参数传递到映射
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
使用
.map
比使用.apply
有什么好处吗?因为我们使用的是一个系列,所以两者都是可能的。您可以在此处阅读更多内容: