本文介绍了 pandas 替换为默认值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个熊猫数据框,我想有条件地替换某些列.
I have a pandas dataframe I want to replace a certain column conditionally.
例如:
col
0 Mr
1 Miss
2 Mr
3 Mrs
4 Col.
我想将它们映射为
{'Mr': 0, 'Mrs': 1, 'Miss': 2}
如果dict中现在还有其他标题可用,那么我希望它们的默认值为3
If there are other titles now available in the dict then I want them to have a default value of 3
以上示例变为
col
0 0
1 2
2 0
3 1
4 3
我可以使用pandas.replace()而不使用正则表达式吗?
Can I do this with pandas.replace() without using regex ?
推荐答案
您可以使用 map
而不是replace
,因为速度更快,然后 fillna
由3
并由 astype
:
You can use map
rather as replace
, because faster, then fillna
by 3
and cast to int
by astype
:
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
的条件:
Another solution with numpy.where
and condition with 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
的解决方案:
Solution with 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
这篇关于 pandas 替换为默认值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!