将 Substring 替换为列 Pandas 中的另一个字符串

Replacing Substring with another string from column Pandas

得到这个数据框:

Type String ext_id int_id
1 UKidBC 2393 2820
1 UKidBC 4816 1068
0 UKidBC 4166 3625
0 UKidBC 2803 1006
1 UKidBC 1189 2697

对于字符串列上的每个值,我需要根据以下规则替换子字符串 'id' (UKidBC):

如果 df['Type'] = 1 则将子字符串 'id' 替换为相应的 df['int_id'] 值,否则将子字符串 'id' 替换为相应的 df['ext_id'] 值。

我尝试使用那条线:

new_df.apply(lambda x: x['string'].replace(pat=['id'], 
   repl=x['int_id']) if x['Type'] == 1
   else x['string'].replace(pat=['id'],repl=x['ext_id']),axis=1)

不断出现此错误:

str.replace() takes no keyword arguments

我做错了什么?

代替apply,我们可以使用str.split + np.where根据“类型”值替换值:

tmp = df['String'].str.split('id', expand=True)
df['String'] = tmp[0] + np.where(df['Type'].astype(bool), df['int_id'].astype(str), df['ext_id'].astype(str)) + tmp[1]

输出:

   Type    String  ext_id  int_id
0     1  UK2820BC    2393    2820
1     1  UK1068BC    4816    1068
2     0  UK4166BC    4166    3625
3     0  UK2803BC    2803    1006
4     1  UK2697BC    1189    2697

老实说,这个问题看起来就像您看到的那些编码挑战之一。

假设你的dataframe变量是new_df:

for i in new_df:
    i["string"].replace("id", i["int_id"] if i["type"] else i["ext_id"])

你做错的是(正如错误所说)你给 str.replace 关键字参数,它不接受 kwargs。相反,第一个参数是要替换的模式,第二个参数是用什么替换它。

假设您的字符串是固定的,请使用 numpy.where 和矢量字符串连接:

df['String'] = df['String'].str[:2] + np.where(df['Type'].eq(1), df['int_id'], df['ext_id']) + df['String'].str[4:]

您可以使用 .str.extractnp.where:

df['String'] = df['String'].str.extract(r'(?P<g0>.+)id(?P<g2>.+)').assign(g1=np.where(df['Type'] == 1, df['int_id'], df['ext_id']).astype(str)).sort_index(axis=1).agg(list, axis=1).str.join('')

输出:

>>> df
   Type    String  ext_id  int_id
0     1  UK2820BC    2393    2820
1     1  UK1068BC    4816    1068
2     0  UK4166BC    4166    3625
3     0  UK2803BC    2803    1006
4     1  UK2697BC    1189    2697

使用与您相同的想法(apply()replace()),只是稍微修改一下使用replace()

new_df["String"] = new_df.apply(
    lambda row: row["String"].replace("id", row["int_id"]) if row["type"] == 1 else row["String"].replace("id", row["ext_id"]),
    axis=1
)

输出:

   Type    String  ext_id  int_id
0     1  UK2820BC    2393    2820
1     1  UK1068BC    4816    1068
2     0  UK4166BC    4166    3625
3     0  UK2803BC    2803    1006
4     1  UK2697BC    1189    2697

这是使用 str.split()where()

的方法
s = df['String'].str.split('id')
df['String'] = (s.str[0] + 
 (df['ext_id'].where(df['Type'].ne(1),df['int_id'])).astype('str') + 
 s.str[-1])