将一列中的值替换为另一列的特定实例

Replace values in one column for specific instances of another column

我是 Pandas 的新手,不确定如何执行以下操作:

我有一个包含多个列的数据框 (df)。一列称为

OldCat = ['a-nn', 'bb-nm', 'ab-pp', 'ba-nn', 'cc-nm', 'ca-mn']

现在我想创建一个新列 organizes/categories OldCat 以新的方式 (NewCat)。具体来说,我想在 OldCat 中查找包含 a(开头)、ba 或 ca 的字符串 j='^a|ba|ca' 然后在 OldCat 包含 j 的行中将 NewCat 中的 nan 替换为 'A'。 在 R 中,这将是这样的:

 j='^a|ba|ca'
 df[(OldCat %like% j),NewCat := str_replace_all(df[(OldCat %like% j),NewCat], "nan", "A")]

由于 R 对于我非常大的数据集来说相对较慢,我决定切换到 pandas 但我不确定如何获得相同的结果。 干杯

您可以使用矢量化 str.extract 到 return 与 fillna 匹配,将 NaN 替换为字符串 'nan':

In [119]:
df['NewCat'] = df['OldCat'].str.extract('(^a|ba|ca)', expand=False).fillna('nan')
df

Out[119]:
  OldCat NewCat
0      a      a
1     bb    nan
2     ab      a
3     ba     ba
4     cc    nan
5     ca     ca

编辑

IIUC 然后你可以使用 str.containsloc 来设置包含字符串的行:

In [137]:
df.loc[df['OldCat'].str.contains(r'a|ba|ca'), 'NewCat'] = 'A'
df['NewCat'].fillna('nan', inplace=True)
df

Out[137]:
  OldCat NewCat
0   a-nn      A
1  bb-nm    nan
2  ab-pp      A
3  ba-nn      A
4  cc-nm    nan
5  ca-mn      A