想象一下,我有一个值为
的列 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'
我怎样才能让它发挥作用?或者以其他方式对其进行优化,以便不需要花费数十分钟来处理我的百万行数据帧?
答案 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]