如何在熊猫中将数组列读取为数组而不是字符串

时间:2019-09-08 11:49:46

标签: python pandas

我的csv文件中有一列,其值如下:

['Type: CARDINAL, Value: 50p', 'Type: CARDINAL, Value: 10', 'Type: CARDINAL, Value: 10']

问题是,当我将数据加载到数据帧中时,我得到的是string而不是数组,因此无法遍历它。

我也尝试过json.loads(),但是问题有时是我有类似["Type: TIME, Value: last night's"]的值,所以我无法用single quotes (')代替double quotes ("),这使json无法解析我的字符串。

有什么主意如何将我的列读取为数组?

1 个答案:

答案 0 :(得分:2)

使用ast.literal_eval将列表的字符串表示形式转换为lists

import ast

a = "['Type: CARDINAL, Value: 50p', 'Type: CARDINAL, Value: 10', 'Type: CARDINAL, Value: 10']"
df = pd.DataFrame({'col':[a, a]}) 

df['col'] = df['col'].apply(ast.literal_eval)
print (df)
                                                 col
0  [Type: CARDINAL, Value: 50p, Type: CARDINAL, V...
1  [Type: CARDINAL, Value: 50p, Type: CARDINAL, V...

print (type(df.loc[0, 'col']))
<class 'list'>

编辑:

如果需要查找所有无法转换的值:

a = "['Type: CARDINAL, Value: 50p', 'Type: CARDINAL, Value: 10', 'Type: CARDINAL, Value: 10']"
df = pd.DataFrame({'col':[a, a,  'wrong "']}) 

def test(x):
    try:
        return ast.literal_eval(x)
    except:
        return np.nan

df['new'] = df['col'].apply(test)
print (df)
                                                 col  \
0  ['Type: CARDINAL, Value: 50p', 'Type: CARDINAL...   
1  ['Type: CARDINAL, Value: 50p', 'Type: CARDINAL...   
2                                            wrong "   

                                                 new  
0  [Type: CARDINAL, Value: 50p, Type: CARDINAL, V...  
1  [Type: CARDINAL, Value: 50p, Type: CARDINAL, V...  
2                                                NaN 

print (df[df['new'].isna()])

       col  new
2  wrong "  NaN