2016-06-28 147 views
1

我有一个数据框从CSV文件中读取,该文件包含一些包含列表的列。然而,它们最终成为Pandas中的一个字符串,就像本例中的B列一样。我想将此列转换为包含整数列表的新列。一些并发症。 1)原始列中有一些NaN值。这阻止了ast.literal_eval为我工作。 2)如果可能的话,我希望所有结果列表的长度相同(该列中最长列表的长度),并用NAN填充。所以最终应该看起来像C列,其中每个元素都是一个整数列表。这跟我一样近了。所以我有一个字符串列表,但不是整数,并没有填充到最大长度。那么,至少我是这么认为的! :-)将包含字符串和NAN的列转换为Pandas中的整数列表

import pandas as pd 
import numpy as np 
from IPython.display import display 

df = pd.DataFrame({'A' : (1,2,3), 'B': ('[0,1]',np.nan,'[0,1,2]'), \ 
    'C': ([0,1,np.nan],[np.nan,np.nan,np.nan],[0,1,2])}) 
df['D'] = df['B'].str.replace(']','').str.replace('[','').str.split('\W') 
display("Starting point: ", df['B'][0]) 
display("What I want: ", df['C'][0]) 
display("What I have so far: ", df['D'][0]) 

这是从上面的输出:

Starting point: 
[0,1] 
What I want: 
[0, 1, nan] 
What I have so far: 
['0', '1'] 

任何帮助将是非常赞赏,并会节省我很多的头发。

+1

我认为你必须遍历列d所有列表以获得最大的长度。那么你可以像这样扩展所有更短的列表: '''aList.extend(np.nan *(maxLen - len(aList)))''' –

+0

谢谢恭唐! – Michael

回答

1

这应该完成它:

b = df.B.str.extract(r'\[(.*)\]', expand=False).str.split(',', expand=True).fillna(np.nan) 
df['D'] = pd.DataFrame(b.apply(lambda x: tuple(x.values))).applymap(list) 
+0

谢谢piRSquared!一个小的补充是,在(x.values)之后放置axis = 1,否则它沿着列而不是行来执行列表。所以它变成:df ['D'] = pd.DataFrame(b.apply(lambda x:tuple(x.values),axis = 1))。applymap(list) – Michael

相关问题