2017-08-18 24 views
1

想象我有混合文本值轉換列,無有效整數列表

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' 

我怎樣才能得到這個工作?或者以其他方式對其進行優化,以便處理我的百萬行數據幀不需要幾十分鐘?

回答

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]