【问题标题】:Pandas replace with default value熊猫替换为默认值
【发布时间】:2016-12-30 11:48:51
【问题描述】:

我有一个 pandas 数据框,我想有条件地替换某个列。

例如:

   col

 0 Mr
 1 Miss
 2 Mr
 3 Mrs
 4 Col.

我想将它们映射为

{'Mr': 0, 'Mrs': 1, 'Miss': 2}

如果字典中现在还有其他可用的标题,那么我希望它们具有默认值 3

上面的例子变成

   col

 0 0
 1 2
 2 0
 3 1
 4 3

我可以在不使用正则表达式的情况下使用 pandas.replace() 来做到这一点吗?

【问题讨论】:

    标签: python pandas replace dataframe conditional-statements


    【解决方案1】:

    您可以使用map 而不是replace,因为更快,然后3 使用fillna 并通过astype 转换为int

    df['col'] = df.col.map({'Mr': 0, 'Mrs': 1, 'Miss': 2}).fillna(3).astype(int)
    
    print (df)
       col
    0    0
    1    2
    2    0
    3    1
    4    3
    

    numpy.where 的另一个解决方案和isin 的条件:

    d = {'Mr': 0, 'Mrs': 1, 'Miss': 2}
    df['col'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int)
    print (df)
       col
    0    0
    1    2
    2    0
    3    1
    4    3
    

    replace 的解决方案:

    d = {'Mr': 0, 'Mrs': 1, 'Miss': 2}
    df['col'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3)
    print (df)
       col
    0    0
    1    2
    2    0
    3    1
    4    3
    

    时间安排

    df = pd.concat([df]*10000).reset_index(drop=True)
    
    d = {'Mr': 0, 'Mrs': 1, 'Miss': 2}
    df['col0'] = df.col.map(d).fillna(3).astype(int)
    df['col1'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3)
    df['col2'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int)
    print (df)
    
    In [447]: %timeit df['col0'] = df.col.map(d).fillna(3).astype(int)
    100 loops, best of 3: 4.93 ms per loop
    
    In [448]: %timeit df['col1'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3)
    100 loops, best of 3: 14.3 ms per loop
    
    In [449]: %timeit df['col2'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int)
    100 loops, best of 3: 7.68 ms per loop
    
    In [450]: %timeit df['col3'] = df.col.map(lambda L: d.get(L, 3))
    10 loops, best of 3: 36.2 ms per loop
    

    【讨论】:

    • 或者(我还没有计时)-df.col.map(lambda L: d.get(L, 3))
    • phuuu,它很慢,我得到In [4]: %timeit df['col3'] = df.col.map(lambda L: d.get(L, 3))10 loops, best of 3: 36.2 ms per loop
    • 哎哟——和我预期的不太一样……df.col.apply(d.get, args=(3,))呢?
    • 好一点In [6]: %timeit df['col3'] = df.col.apply(d.get, args=(3,))10 loops, best of 3: 25.7 ms per loop
    【解决方案2】:

    补充@jezrael 的答案:最直接的解决方案是使用defaultdict 而不是dict。当您不希望将缺失值替换为默认值时,这尤其有用。

    from collections import defaultdict
    df['col'] = df.col.map(defaultdict(lambda: 3,Mr= 0, Mrs= 1, Miss= 2),na_action='ignore')
    

    defaultdict的第一个参数是一个返回默认值的函数。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2022-09-28
      • 2018-07-11
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多