繁体   English   中英

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

[英]Replacing Substring with another string from column Pandas

得到这个 DataFrame:

类型 细绳 ext_id int_id
1个 UKidBC 2393 2820
1个 UKidBC 4816 1068
0 UKidBC 4166 3625
0 UKidBC 2803 1006
1个 UKidBC 1189 2697

对于 String 列上的每个值,我需要根据以下规则替换 substring 'id' (UK id BC):

如果df['Type'] = 1 ,则将 substring 'id' 替换为相应的df['int_id']值,否则将 substring '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]

Output:

   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

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

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

使用与您相同的想法( 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
)

output:

 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.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('')

Output:

>>> 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

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

假设您的 dataframe 变量是new_df

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

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

这是一种使用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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM