Pandas - 使用 literal_eval 从 CSV 中读取空集
Pandas - Reading empty set from CSV using literal_eval
我已将 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,我可以读取此 csv 文件 ,其中包含表示为 set() 和 null 对象的空集。我为此使用以下代码。
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 提供了处理空集的答案。我怎样才能处理空对象。
还有为什么 Pandas 在将空列表保存为 [] 而不是 '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')
在转换为集合之前使用 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
我已将 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,我可以读取此 csv 文件 ,其中包含表示为 set() 和 null 对象的空集。我为此使用以下代码。
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 提供了处理空集的答案。我怎样才能处理空对象。
还有为什么 Pandas 在将空列表保存为 [] 而不是 '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')
在转换为集合之前使用 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