【问题标题】:How to convert string series into integer如何将字符串序列转换为整数
【发布时间】:2015-10-02 21:03:30
【问题描述】:

pandas 数据框的其中一列包含 0、'a'、'b' 等值。 此列被解析为字符串。现在我想将其转换为整数以获得 0、1、2。我该怎么做?

【问题讨论】:

  • 请向我们展示一些代码方法
  • 你能否展示你的数据的代表性样本、你的尝试和期望的输出,你的解释在这里太基本了

标签: python pandas dataframe


【解决方案1】:

这是一些初始数据:

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。在字典中使用带有getlambda 函数似乎具有几乎相同的性能。

%%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)
【解决方案2】:

保持简单和愚蠢,因为它看起来很简单试试这个方法:

if value == 'a':
   x = 1
if value == 'b':
   x = 2
else:
   x = 0

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多