Pandas 条件,包含,替换

Pandas conditional, contains, replace

我希望有人能帮助我。

我有一个 df,我想在列 'Length' 上使用替换,但我只想在符合条件的某些行上使用替换(我已经能够做到)。问题是不符合以 n/a 结尾的标准的行,但我真的想保留这些行中的现有数据,即不是 运行 替换方法。

这里是选择的代码,条件不包含'hour'。

mask = ~data['Length'].str.contains("hour") 

这是我的替换代码,运行良好。我正在覆盖原始数据。

data['Length'] = data.loc[mask, 'Length'].replace(r'([1])[h]\s', r' hour ', regex=True)
data['Length'] = data.loc[mask, 'Length'].replace(r'([2-9]*)[h]\s', r' hours ', regex=True)
data['Length'] = data.loc[mask, 'Length'].replace(r'([0-9]*)[m]', r' minutes', regex=True)

输入数据。第 0 行具有我在原始数据中需要的格式。其他行需要通过替换功能运行。

0    1 hour 30 minutes
1               2h 45m
2               4h 30m
3               1h 45m
4               1h 45m
5               1h 45m
6               1h 45m
7               1h 45m

当前输出,我想保留第0行的原始数据。

0                   NaN
1    2 hours 45 minutes
2    4 hours 30 minutes
3     1 hour 45 minutes
4     1 hour 45 minutes
5     1 hour 45 minutes
6     1 hour 45 minutes
7     1 hour 45 minutes

现在我还没有完全接受我所使用的方法,所以如果有更好的方法,我愿意接受建议,但希望有一些简单的东西是我所缺少的。看起来它应该很简单,因为它只是一个 if-else。谢谢

您还必须在作业左侧传入 mask

# Add ".loc[mask, " on the left side:
data.loc[mask, 'Length'] = data.loc[mask, 'Length'].replace(r'([1])[h]\s', r' hour ', regex=True)
data.loc[mask, 'Length'] = data.loc[mask, 'Length'].replace(r'([2-9]*)[h]\s', r' hours ', regex=True)
data.loc[mask, 'Length'] = data.loc[mask, 'Length'].replace(r'([0-9]*)[m]', r' minutes', regex=True)

否则,您将通过向其分配经过过滤的(较短长度的)series 来改变整个 data['Length'] 列,这会使空槽自动填充 np.nan

当使用这些正则表达式替换然后将结果分配给 data['Length'] 时,原始数据帧被覆盖并且第一行的原始值丢失,因为一个新的(较小的)长度为 7 的系列进入长度为 8 的系列,使用与 mask 相同的索引(这就是第一行被 NaN 替换的原因)

试试这个:

mask = ~data['Length'].str.contains("hour") 

data[mask] = data.loc[mask].replace(r'([1])[h]\s', r' hour ', regex=True)
data[mask] = data.loc[mask].replace(r'([2-9]*)[h]\s', r' hours ', regex=True)
data[mask] = data.loc[mask].replace(r'([0-9]*)[m]', r' minutes', regex=True)