【发布时间】:2015-10-02 21:03:30
【问题描述】:
pandas 数据框的其中一列包含 0、'a'、'b' 等值。 此列被解析为字符串。现在我想将其转换为整数以获得 0、1、2。我该怎么做?
【问题讨论】:
-
请向我们展示一些代码方法
-
你能否展示你的数据的代表性样本、你的尝试和期望的输出,你的解释在这里太基本了
pandas 数据框的其中一列包含 0、'a'、'b' 等值。 此列被解析为字符串。现在我想将其转换为整数以获得 0、1、2。我该怎么做?
【问题讨论】:
这是一些初始数据:
df = pd.DataFrame({'col': [0, 'a', 'b', 'a']})
>>> df
col
0 0
1 a
2 b
3 a
您可以创建要替换的项目的字典:
d = {'a': 1, 'b': 2}
然后,对列应用get,如果它不在字典中,则返回原始值:
df['col'] = df.col.apply(lambda x: d.get(x, x))
>>> df
df
col
0 0
1 1
2 2
3 1
@EdChum 如果该系列中包含的所有唯一项都在字典键中,那么.map(d) 的速度要快五倍以上。但是,任何缺失值都显示为 NaN。在字典中使用带有get 的lambda 函数似乎具有几乎相同的性能。
%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000})
df['col'] = df.col.map(d)
10 loops, best of 3: 33.3 ms per loop
>>> df.head()
col
0 NaN
1 1
2 2
3 1
4 NaN
%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000})
df['col'] = df.col.apply(lambda x: d.get(x, x))
10 loops, best of 3: 188 ms per loop
%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000})
df['col'] = df.col.map(lambda x: d.get(x, x))
10 loops, best of 3: 188 ms per loop
In [64]: %timeit df['col'] = df.col.map(d)
10 loops, best of 3: 36.1 ms per loop
这是疯狂的部分。我之前测试了这几行代码,得到了不同的结果:
%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000})
df['col'] = df.col.map(d)
10 loops, best of 3: 33.4 ms per loop
>>> df.head()
col
0 0
1 1
2 2
3 1
4 0
>>> pd.__version__
'0.16.2'
【讨论】:
map,它是cyython-ised:df[col].map(d)
保持简单和愚蠢,因为它看起来很简单试试这个方法:
if value == 'a':
x = 1
if value == 'b':
x = 2
else:
x = 0
【讨论】: