熊猫-使用literal_eval从CSV读取空集

时间:2020-04-18 08:41:04

标签: pandas dataframe abstract-syntax-tree

我已将Pandas数据框保存到CSV文件,并且在此过程中丢失了数据类型信息并进行了设置,并将列表转换为字符串。

这是我的csv文件。

|id|words|tags
0|A|{'-', 'Drawings', 'Jude'}|[]
1|B|{'mafalda'}|[]
2|C|set()|[]
3|D|{'Sidestepping', 'flood'}|['mountain']
4|E|{'visvim','jack'}|[]
5|F|set()|[]
6|-G|<class 'object'>|<class 'object'>

如果我删除索引号2、5和6 (包含表示为set()的空集和空对象),我将能够读取该csv文件。我为此使用了以下代码。

from ast import literal_eval

df = pd.read_csv('testdata.csv', sep='|' )
df['words'] = df['words'].apply(literal_eval)
df['tags'] = df['tags'].apply(literal_eval)

但是,当有空集时,我会提到

ValueError: malformed node or string: <_ast.Call object at 0x7f44250fc250>

如何正确读取空集?

更新:jezrael提供了处理空集的答案。我也该如何处理空对象。

这也是为什么熊猫将空列表保存为[]而不是'list []'时将空集保存为'set()'

更新:创建带有空对象的CSV的示例代码。

col_names =  ['A', 'B']
df  = pd.DataFrame(columns = col_names)
df.loc[len(df)] = [2, 4]
df

df['C']=object
print(df)
print(type(df))
df.to_csv('Sample_File', sep='|', encoding='utf-8')

1 个答案:

答案 0 :(得分:1)

在转换为集合之前使用Series.replace

df['words'] = df['words'].replace('set()','{}').apply(literal_eval)
df['tags'] = df['tags'].apply(literal_eval)

print (df)
  id                  words        tags
0  A    {Jude, -, Drawings}          []
1  B              {mafalda}          []
2  C                     {}          []
3  D  {Sidestepping, flood}  [mountain]
4  E         {jack, visvim}          []
5  F                     {}          []

编辑:

def repl(x):
    try:
        return literal_eval(x.replace('set()','{}'))
    except:
        return np.nan

df['words'] = df['words'].apply(repl)
df['tags'] = df['tags'].apply(repl)

print (df)
   id                  words        tags
0   A    {Jude, -, Drawings}          []
1   B              {mafalda}          []
2   C                     {}          []
3   D  {Sidestepping, flood}  [mountain]
4   E         {jack, visvim}          []
5   F                     {}          []
6  -G                    NaN         NaN