熊猫替换为默认值
Posted
技术标签:
【中文标题】熊猫替换为默认值【英文标题】: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() 来做到这一点吗?
【问题讨论】:
【参考方案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的第一个参数是一个返回默认值的函数。
【讨论】:
以上是关于熊猫替换为默认值的主要内容,如果未能解决你的问题,请参考以下文章