首页 > 解决方案 > 熊猫有条件,包含,替换

问题描述

我希望有人可以帮助我解决这个问题。

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

这是进行选择的代码,标准不包含“小时”。

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

这是我的替换代码,它工作正常。我正在写原始数据。

data['Length'] = data.loc[mask, 'Length'].replace(r'([1])[h]\s', r'\1 hour ', regex=True)
data['Length'] = data.loc[mask, 'Length'].replace(r'([2-9]*)[h]\s', r'\1 hours ', regex=True)
data['Length'] = data.loc[mask, 'Length'].replace(r'([0-9]*)[m]', r'\1 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。谢谢

标签: pythonpandasreplacecontainspandas-loc

解决方案


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

试试这个:

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

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

推荐阅读