【发布时间】:2018-04-07 13:34:36
【问题描述】:
给定一个 csv 文件,其中某些列包含列表、集合或字典,例如 结构如下:
| user_id| items | methods | dict_col |
|--------|-------------------------|----------------|---------------|
| ID01 | [potato, apple, potato] | {card, cash} | {F: [AB, CD]} |
| ID02 | [carrots, papaya] | {bitcoin, card}| {F: [AB, CD]} |
有没有办法在 Python 中以表格方式摄取它,其中维护这些列中值的类型?
如果不是,将它们转换回列表、集合、字典的最佳方法是什么?
问题源于这样一个事实,即一旦有一个具有这种结构的 DataFrame 并将其保存到 csv 中,当使用 pandas.read_csv() 加载 csv 时,这些列中的值不再是列表,设置或字典。
在代码下方重新创建上述场景。
import pandas as pd
# Create dummy example
df = pd.DataFrame({'user_id': ['ID01', 'ID02'], 'items': [['potato', 'apple', 'potato'],['carrots', 'papaya']],
'methods': [{'card', 'cash'}, {'bitcoin', 'card'}],
'dict_col': [{'F': ['AB', 'CD']}, {'F': ['AB', 'CD']}]})
df[['user_id', 'items', 'methods', 'dict_col']]
type(df.iloc[0]['dict_col']) # Return a dict
df.to_csv('dummy_table.csv', index = False)
# Reload the table
df_loaded = pd.read_csv('dummy_table.csv')
"""
Line below returns a str and not a dict as in the original dataframe. How we go back to the original datatypes
(e.g. list, dict, set)in a pythonic way?
"""
type(df_loaded.iloc[0]['dict_col'])
在 Kyle J. 评论尝试使用 cvs.DictReader 之后尝试
我尝试使用 DictReader,但没有达到目标。但是,我不确定这就是凯尔的想法。
尝试使用 DictReader
import csv
import pandas as pd
df = pd.DataFrame()
with open('dummy_table.csv', newline = '') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
df = pd.concat([df, pd.DataFrame(row, index = [0])], axis = 0)
type(df.iloc[0]['dict_col']) # Still a str
【问题讨论】:
-
您能否使用 csv 文件的摘录来编辑您的问题(例如,您在文本编辑器中看到的内容)?
-
你试过标准的 csv python 模块吗?特别是 csv.dictreader() docs.python.org/3/library/csv.html#csv.DictReader
-
@jpp 根据您的注释,我添加了代码来重新创建场景。通过这种方式,不仅可以复制摘录,而且可以为任何想要查看这个问题的人节省时间。如果这不合适,很高兴再次编辑。
-
@datapug,看起来不错。我赞成你的问题。这可能并不简单。以这种方式将字典和列表存储在 csv 文件中肯定是不理想。我会放弃这个想法并为您的数据尝试不同的结构。但只是我的看法。
-
我建议使用 mysql 或 Postgres 之类的数据库来处理 json 值并适当地返回它们,您必须使用 json.dumps(dict) 将 dict 转换为 json 来输入数据,python然后非常简单地将 json 数据视为字典。 mysql 真的很容易学习,如果你使用 mysql 工作台,它几乎和使用 excel 一样简单,如果需要,你可以非常简单地将所有数据导出到 csv 文件中。
标签: python python-3.x csv tabular