将 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.extract
和 np.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])
得到这个数据框:
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.extract
和 np.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])