【问题标题】:Pandas conditional, contains, replace熊猫有条件,包含,替换
【发布时间】:2020-04-19 14:28:30
【问题描述】:

我希望有人可以帮助我。

我有一个 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。谢谢

【问题讨论】:

    标签: python pandas replace contains pandas-loc


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢费利佩的快速回复。我试过了,得到了TypeError: 'Series' objects are mutable, thus they cannot be hashed Traceback line 130, in time_format_change data[mask, 'Length'] = data.loc[mask, 'Length'].replace(r'([1])[h]\s', r'\1 hour ', regex=True)
    • 您确定在左侧添加了loc
    【解决方案2】:

    当使用这些正则表达式替换然后将结果分配给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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2019-05-29
      • 2019-03-04
      • 2017-11-30
      • 2022-08-11
      • 2018-10-31
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多