将具有混合文本值和None的列有效地转换为整数列表

时间:2017-08-18 02:01:57

标签: python pandas dataframe

想象一下,我有一个值为

的列

data = pd.DataFrame([['1,2,3'], ['4,5,6'], [None]])

我希望输出为:

[[1,2,3]], [[4,5,6]], [None]]

换句话说,将逗号分隔的字符串拆分为列表,同时忽略None值。

此功能适用于apply

def parse_text_vector(s):
    if s is None:
        return None
    else:
        return map(int, s.split(','))

如本例所示:

df = pd.DataFrame([['1,2,3'], ['4,5,6'], [None]])
result = df[0].apply(parse_text_vector)

但是在数百万行中,这变得非常慢。我希望通过做一些基于

的事情来改善运行时间

parse_text_vector(df.values),但这会导致:

In [61]: parse_text_vector(df.values)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-61-527d5f9f2b84> in <module>()
----> 1 parse_text_vector(df.values)

<ipython-input-49-09dcd8f24ab3> in parse_text_vector(s)
      4         return None
      5     else:
----> 6         return map(int, s.split(','))

AttributeError: 'numpy.ndarray' object has no attribute 'split'

我怎样才能让它发挥作用?或者以其他方式对其进行优化,以便不需要花费数十分钟来处理我的百万行数据帧?

1 个答案:

答案 0 :(得分:2)

使用df.str.split然后转换为列表:

In [9]: df
Out[9]: 
    Col1
0  1,2,3
1  4,5,6
2   None

In [10]: df.Col1.str.split(',').tolist()
Out[10]: [['1', '2', '3'], ['4', '5', '6'], None]

要将内部列表元素转换为整数,您可以在列表理解中使用map进行转换:

In [22]: [list(map(int, x)) if isinstance(x, list) else x for x in df.Col1.str.split(',').tolist()]
Out[22]: [[1, 2, 3], [4, 5, 6], None]