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