Pandas替换为默认值

时间:2016-08-23 15:04:58

标签: python pandas replace dataframe conditional-statements

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

例如:

   col

 0 Mr
 1 Miss
 2 Mr
 3 Mrs
 4 Col.

我想将它们映射为

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

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

以上示例变为

   col

 0 0
 1 2
 2 0
 3 1
 4 3

我可以使用pandas.replace()而不使用正则表达式吗?

2 个答案:

答案 0 :(得分:11)

您可以使用map而不是replace,因为速度更快,3更快intdf['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 fillna { / p>

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

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

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

isin的解决方案:

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

<强>计时

...Action()

答案 1 :(得分:1)

添加@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 的第一个参数是返回默认值的函数。