得到了這個資料框:
| 型別 | 細繩 | 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 列上的每個值,我需要根據以下規則替換子字串 'id' (UK id BC):
如果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
我在這里做錯了什么?
uj5u.com熱心網友回復:
代替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
uj5u.com熱心網友回復:
假設你的字串是固定的,使用numpy.where和向量字串連接:
df['String'] = df['String'].str[:2] np.where(df['Type'].eq(1), df['int_id'], df['ext_id']) df['String'].str[4:]
uj5u.com熱心網友回復:
您可以使用.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
uj5u.com熱心網友回復:
使用與您相同的想法(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
uj5u.com熱心網友回復:
老實說,這個問題看起來像是您看到的那些編碼挑戰之一。
假設您的資料框變數是new_df:
for i in new_df:
i["string"].replace("id", i["int_id"] if i["type"] else i["ext_id"])
您做錯的是(如錯誤所示)您將關鍵字引數提供給str.replace,這不需要 kwargs。相反,第一個引數是要替換的模式,第二個引數是替換它的內容。
uj5u.com熱心網友回復:
使用 np.where 串列理解可以快速為您服務:
strings = np.where(df['Type'].eq(1),df['int_id'],df['ext_id']).astype(str)
df['String'] = [a.replace("id",b) for a,b in zip(df['String'],strings)]
print(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
uj5u.com熱心網友回復:
這是一種使用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])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/443057.html
上一篇:資料幀轉置后對值進行排序
