python - 熊猫有条件,包含,替换
问题描述
我希望有人可以帮助我解决这个问题。
我有一个 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。谢谢
解决方案
当使用这些正则表达式替换然后将结果分配给 时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)
推荐阅读
- javascript - 如何根据条件获取 jsp 页面中的图标?
- postgresql - 如何在postgres 9.5中取消嵌套多个数组和转置表
- android - 删除项目时Android recyclerview不更新
- mysql - 列出时间线和计数重叠
- javascript - 使 jQuery.load() 与 SEO 友好的 URL 一起工作
- python - Python向变量添加更多内容,然后写入代码
- python - 如何找到附加到一个或另一个类的元素?硒Pyton
- calculator - 如何快速修复roundig操作
- c# - 如何读取原始 JSON 字符串值部分,如下所述
- asp.net-core - Azure B2C 应用程序中的用户角色