操纵数据框系列

Manipulate Dataframe Series

我有一个数据框,我想根据条件更改列的某些元素。 特别是鉴于此专栏:

...    VALUE    ....
       0
       "1076A"
       12
       9
       "KKK0139"
       5

我想获得这个:

...    VALUE    ....
       0
       "1076A"
       12
       9
       "0139"
       5

在'VALUE'列中既有字符串又有数字,当我在字符串值中找到特定的子字符串时,我想获得没有该子字符串的相同值。 我试过:

1) df['VALUE'] = np.where(df['VALUE'].str.contains('KKK', na=False), df['VALUE'].str[3:], df['VALUE'])

2) df.loc[df['VALUE'].str.contains('KKK', na=False), 'VALUE'] = df['VALUE'].str[3:]

但这两次尝试returns一个IndexError:标量变量的索引无效

一些建议?

>>> df['VALUE'].str.replace(r'KKK', '')
0        0
1    1076A
2       12
3        9
4     0139
5        5
Name: VALUE, dtype: object

您的第二个解决方案失败,因为您还需要将行选择器应用到作业的右侧。

df.loc[df['VALUE'].str.contains('KKK', na=False), 'VALUE'] = df.loc[df['VALUE'].str.contains('KKK', na=False), 'VALUE'].str[3:]

查看您的示例数据,如果 k 是唯一的问题,只需将其替换为空字符串

df['VALUE'].str.replace('K', '')
0          0
1    "1076A"
2         12
3          9
4     "0139"
5          5
Name: text, dtype: object

如果您想对 k 的特定出现或位置执行此操作,您也可以这样做。

由于该列同时包含数值(非字符串)和字符串值,您不能使用 .str.replace(),因为它只处理字符串。您必须改用 .replace()。否则,非字符串元素将被 str.replace().

转换为 NaN

在这里,您可以使用:

df['VALUE'] = df['VALUE'].replace(r'KKK', '', regex=True)

输入:

data = {'VALUE': [0, "1076A", 12, 9, "KKK0139", 5]}
df = pd.DataFrame(data)

结果:

0        0
1    1076A
2       12
3        9
4     0139
5        5
Name: VALUE, dtype: object

如果你使用.str.replace(),你将得到:

注意数值的 NaN 值结果(不是字符串类型)

0      NaN
1    1076A
2      NaN
3      NaN
4     0139
5      NaN
Name: VALUE, dtype: object

一般情况下,如果要删除前导字母子串,可以使用:

df['VALUE'] = df['VALUE'].replace(r'^[A-Za-z]+', '', regex=True)