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)
我希望有人能帮助我。
我有一个 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)