我有一个csv文件,它的类型是字典(下面示例中的列'b‘)。但是,b in df是一个字符串类型,即使我将它定义为字典类型。我没有找到这个问题的解决办法。有什么建议吗?
a = pd.DataFrame({'a': [1,2,3], 'b':[{'a':3, 'haha':4}, {'c':3}, {'d':4}]})
a.to_csv('tmp.csv', index=None)
df = pd.read_csv('tmp.csv', dtype={'b':dict})
发布于 2017-06-08 15:02:16
我想知道CSV列是否实际上是Python列,或者更确切地说是JSON。如果是JSON,则可以将该列读入dtype=str
,然后在该列上使用json_normalize()
将其分解为多个列。假设列包含有效的JSON,这是一个有效的解决方案。
发布于 2017-06-08 14:59:18
熊猫没有字典类型。因此,您应该指定object
,以防需要普通Python对象:
df = pd.read_csv('tmp.csv', dtype={'b':object})
这将包含字符串,因为熊猫不知道什么字典。如果您再次需要字典,您可以尝试使用ast.literal_eval
(安全字符串计算)来“验证”它们:
df['b'] = df['b'].apply(ast.literal_eval)
print(df['b'][0]['a']) # 3
如果您真的确信您从未在不受信任的csvs上运行此操作,那么您也可以使用eval
。但在您考虑之前,我建议您尝试只对“本地”熊猫或DataFrame
类型使用NumPy (也可能是DataFrame
in DataFrame
方法)。最好尽量避免object
类型。
发布于 2022-01-18 23:33:27
您可以使用转换器参数。从文件中:
转换器: dict,可选 用于转换某些列中的值的函数的Dict。键可以是整数,也可以是列标签。
如果您知道您的列格式良好且不包含缺少的值,那么您可以这样做:
df = pd.read_csv('tmp.csv', converters = {'b': ast.literal_eval})
但是,为了安全(正如其他人所评论的那样),您可能应该使用一些基本的错误恢复能力来定义自己的函数:
def to_dict(x):
try:
y = ast.literal_eval(x)
if type(y) == dict:
return y
except:
return None
然后:
df = pd.read_csv('tmp.csv', converters = {'b': to_dict})
https://stackoverflow.com/questions/44446709
复制