【问题标题】:How to efficiently perform many replacements of values in a large Pandas dataframe (Python)如何在大型 Pandas 数据框中有效地执行许多值替换(Python)
【发布时间】:2022-10-24 19:19:03
【问题描述】:

如何检查行值是否匹配某些条件并修改值? 例如,如果 value1 和 value2 与条件匹配,那么我将它们更改为另一个值。

我正在使用这种方法:

df['column'] = df['column'].replace(['matching1', 'matching2'], 'value1')
df['column'] = df['column'].replace(['matching3', 'matching4'], 'value2')
...
df['column'] = df['column'].replace(['matching999', 'matching1000'], 'value500')

但是我需要处理很多条件,所以写很多这样的命令可能看起来太笨拙了,因为每个条件都必须重新检查整个数据帧。

有什么方法可以更快完成吗? 例如,满足条件后已经修改的行不需要再次检查

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我可以想到两个选择。就扫描次数而言,我认为两者都比重复替换更有效。 (虽然没有进行基准测试。)

    假设我们要将“Apple”和“Orange”更改为“value1”,将“Lemon”更改为“value2”。

    replace 带字典

    df = pd.DataFrame(['Apple','Apple','Orange','Lemon','Banana','Apple'], columns=['column'])
    
    df['column'].replace({'Apple': 'value1', 'Orange': 'value1', 'Lemon': 'value2'}, inplace=True)
    

    map

    df = pd.DataFrame(['Apple','Apple','Orange','Lemon','Banana','Apple'], columns=['column'])
    
    def func(x):
        if x == 'Apple' or x == 'Orange':
            return 'value1'
        elif x == 'Lemon':
            return 'value2'
        return x
    
    df['column'] = df['column'].map(func)
    

    两者之间的一个区别是 map 选项更灵活,而 dict 选项在某些情况下更简洁。例如,如果要进行不区分大小写的匹配,则需要使用 map。

    【讨论】:

      【解决方案2】:

      您可以使用np.select(),在其中创建条件列表和选择列表。

      col = df['column']
      condlist = [col='matching1',col='matching2',col='matching3',col='matching4',...,col='matchingn']
      choicelistlist = ['value1','value1','value2','value3',...'valuei']
      df['column'] = np.select(condlist,choicelist)
      

      到目前为止,我一直相信大多数 numpy 函数,包括np.select() 都是矢量化的,并且与你所能得到的一样高效。我对自己的工作原理不太了解,但似乎确实如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 2020-06-19
        • 2020-08-20
        • 2020-09-27
        • 2023-03-16
        • 2022-01-12
        相关资源
        最近更新 更多