【问题标题】:Replace strings using a dictionary without deleting characters in a pandas dataframe使用字典替换字符串而不删除熊猫数据框中的字符
【发布时间】:2020-04-25 04:46:50
【问题描述】:

我有一种查找问题,我尝试使用函数 replace dict zip(见下文),但这并不能完全产生我想要的结果,因为在此过程中删除了字符(下划线) .

问题

  1. 什么是在不删除的情况下生成 df3 的有效方法 df1 中的下划线?在我真正的问题中,df1 更大,至少(200, 500) 而不是 (2, 4),如下例所示。
  2. 要创建 df3,为什么我不能使用 replace dict zip 如下, 不删除 df1 中的下划线?

df1 包含以特定模式排列的带有下划线的唯一字符串:

import pandas as pd
df1 = pd.DataFrame([['1_1','1_2', '2_1', '2_2'],['1_3','1_4', '2_3', '2_4']])
df1
         0    1    2    3
    0  1_1  1_2  2_1  2_2
    1  1_3  1_4  2_3  2_4

df2 包含 df1 中某些字符串的字典:

df2 = pd.DataFrame([['1_1',234],['1_2',456],['2_3',324],['2_4',765]], columns = ['a', 'b'])
df2

     a    b
0  1_1  234
1  1_2  456
2  2_3  324
3  2_4  765

我想创建 df3,其中 df1 中包含的确切字符串被替换为 df2.b 中的相应值。但是,当我运行以下代码时,df3 中 2_1、2_2 等的下划线对于 df2 中不包含的字符串会消失。

df3 = df1.replace(dict(zip(df2.a, df2.b)))
df3

     0    1    2    3
0  234  456   21   22
1   13   14  324  765

df3 中的期望结果应该是:

     0    1    2    3
0  234  456   2_1   2_2
1   1_3   1_4  324  765

或者,或者:

     0    1    2    3
0  234  456   NaN   NaN
1   NaN   NaN  324  765

【问题讨论】:

    标签: python pandas dictionary replace


    【解决方案1】:

    您可以使用df.mask 作为替代:

    s=df2.set_index('a')['b']
    df1.mask(df1.isin(s.index),df1.replace(s))
    

         0    1    2    3
    0  234  456  2_1  2_2
    1  1_3  1_4  324  765
    

    【讨论】:

    • 要删除“2_1”等,我将代码更改为:df1.mask(df1.isin(s.index),df1.replace(s)).apply(pd.to_numeric,errors='coerce ')
    猜你喜欢
    • 2019-01-25
    • 2018-08-01
    • 2021-09-07
    • 2022-10-13
    • 2017-09-04
    • 1970-01-01
    • 2018-09-24
    • 2017-09-09
    相关资源
    最近更新 更多