Python 用查找表中的值替换熊猫系列中的多个字符串

Python 用查找表中的值替换熊猫系列中的多个字符串,python,pandas,lookup,data-manipulation,Python,Pandas,Lookup,Data Manipulation,我有一个这样的数据框,其中类型列是用~~分隔的字符串: 我需要根据如下所示的查找表替换“type”列中的字符串,其中两列都是字符串。在执行此操作时,我需要确保最终输出的类型之间有逗号 因此,最终输出如下所示: id | types | -------------------------------------------- 1 | This is good, This is not good | 2 | This

我有一个这样的数据框,其中类型列是用~~分隔的字符串:

我需要根据如下所示的查找表替换“type”列中的字符串,其中两列都是字符串。在执行此操作时,我需要确保最终输出的类型之间有逗号

因此,最终输出如下所示:

id | types                                 |
--------------------------------------------
1  | This is good, This is not good        |
2  | This is not good                      |
3  | This is good, This is OK, This is bad |
我已经读过了。map是一个很好的函数,但是我还没有弄清楚如何将它应用到这个场景中。提前感谢。

映射确实是一种方法,但要实现您想要的输出,有几个步骤。如果查找表是以类型作为索引的系列,则可以映射到该表。不过,首先需要在分隔符上拆分~:

让第一个表为df1,第二个表为df2

我假定第二个数据帧中的类型充当数据帧的索引

df1.map(lambda x: ','.join([df2[i] for i in x.split('~')]))

以上大多数答案都使用apply,它不会矢量化。我建议使用str.replace:

这里,我假设映射字典中的映射数远小于数据帧中的行数

如果您在数据帧中有字符串映射,请如您所说将其称为df\u映射,您可以通过运行以下命令从它创建字典:string\u map=df\u映射。将{u index'type'['description']]设置为{u dict。确保{type:'~','description':',}作为df\u映射中的一行。

df.types.str.replace('~', '|').agg(lambda k: df2.loc[df2.type.str.contains(k)].description.str.cat(sep=', ')
解释:

您可以使用replace来替换~to |。这样,就可以得到字符串,例如

A1|B1
可以使用str.contains轻松搜索,例如

返回

    type    description
0   A1  This is good
2   B1  This is not good
要将这些描述值连接到{},{},只需使用str.cat。所以上面给出了

...description.str.cat(sep=', ')

'This is good, This is not good'

您可以创建到描述的系列映射类型:

然后通过列表映射您的值:

df['types'] = [', '.join(map(s.get, x.split('~'))) for x in df['types'].values]
pd.Series.map也可以使用类似的逻辑,但效率可能较低。

使用get\u假人,然后替换重命名列,然后使用点

你用map做了什么尝试?
A1|B1
df2.loc[df2.type.str.contains('A1|B1')]
    type    description
0   A1  This is good
2   B1  This is not good
...description.str.cat(sep=', ')

'This is good, This is not good'
s = df_types.set_index('type')['description']
df['types'] = [', '.join(map(s.get, x.split('~'))) for x in df['types'].values]
newdf=df1['types'].str.get_dummies(sep='~').rename(columns=dict(zip(df2.type,df2.description+',')))
newdf.dot(newdf.columns)
Out[232]: 
id
1          This is good,This is not good,
2                           This is good,
3    This is good,This is OK,This is bad,
dtype: object
newdf.dot(newdf.columns).str[:-1]
Out[233]: 
id
1          This is good,This is not good
2                           This is good
3    This is good,This is OK,This is bad
dtype: object