假设我有一个包含值的列
data = pd.DataFrame([['1,2,3'], ['4,5,6'], [无]])
我希望输出是:
[[1,2,3]],[[4,5,6]],[无]]
换句话说,将逗号分隔的字符串拆分为列表,同时忽略 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'
我怎样才能让它发挥作用?或者以其他方式对其进行优化,以便处理我的百万行数据帧不需要花费数十分钟?
最佳答案
使用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]
关于python - 有效地将具有混合文本值和 None 的列转换为整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747393/