【问题标题】:How can i read a python dict contained in a csv file and store the data in a pandas dataframe?如何读取 csv 文件中包含的 python dict 并将数据存储在 pandas 数据框中?
【发布时间】:2019-09-21 19:08:20
【问题描述】:

我有一个csv,其中每一行都是一个字典,在每一行的字典内,有一个列表,这个列表包含一个子列表和一个子字典。每个子列表有 2 个元素,子字典有 100 个键,每个键有一个值。这是数据的截图:

以下是文本格式的数据示例:

{"0": [[10.8, 36.0], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"1": [[10.8, 36.1], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"2": [[10.8, 36.2], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"3": [[10.8, 36.300000000000004], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"4": [[10.8, 36.4], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"5": [[10.8, 36.5], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"6": [[10.8, 36.6], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"7": [[10.8, 36.7], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0}]}
{"8": [[10.8, 36.800000000000004], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0}]}
{"9": [[10.8, 36.9], {"0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0}]}

我想做的是把它读入一个熊猫数据框,它会产生这样的预期输出(为了简单起见,我只输入一行):

list_elemnt_1   list_elemnt_2  key_0,  key_1,  key_2,  key_3,  key_4,  and so on...
        value           value  value   value   value   value   value   and so on...

对于 csv 中的每一行,我想构建一个数据框,每个子列表值 (2) 有一列,该行的字典中包含的子字典中的每个键对应一列。

我怎么能这样做?如果需要,请随时询问更多信息。

非常感谢您

编辑

Key_0、key_1、key_2 等...是子字典键,而不是主字典键

【问题讨论】:

  • 您确定您提供的数据正确吗?第一个括号和第一个括号没有关闭
  • key_0 是哪个值?主字典键还是子字典键?
  • @zero 对不起,现在已修复
  • 每一行看起来都像 JSON 数据,因此您可以将每一行作为普通文本读取并转换为 Python 的字典 data = json.loads(line_from_file),然后您就可以使用字典了。
  • @P.hunter 是的,我的意思是open().readline() - 这就是为什么我使用名称line_from_file,而不是full_fileall_text_from_file。我这样做只是因为有问题的文件格式。

标签: python python-3.x pandas csv dictionary


【解决方案1】:

不是最好的方法。

# Edit for reading the csv

# there are two ways to go about it, I am assuming data is in 1 column
df_csv = pd.read_csv('/path/to/your/file/filename.csv')


# read in the csv, I assume you are able to do this.
list_of_dfs = []
for idx, row in df_csv.iterrows():
      d = row[column_name]   # find the column name and insert here
      df = pd.DataFrame.from_dict(d,orient='index') # creating a dataframe to get the number of lines

     remove_cols = df.columns

    for i in d.keys():
         df['list_elemnt_1'] = d[i][0][0]
         df['list_elemnt_2'] = d[i][0][1]
         for key in d[i][1].keys():
               df[key] = d[i][1][key]

         # remove the original cols here
         list_of_dfs.append(df)


这会给你每行的dfs 作为list_of_dfs 中的一个行元素,我认为这是目标? 让我知道它是否有效。

【讨论】:

  • 感谢您的回答。但是您将如何阅读 csv?使用 open(csv).readlines()??或如何?因为我在这里看到您直接复制粘贴了一行并将其存储在一个变量中,但这不是真正的用例
  • @Miguel2488 是 csv 中的单列吗?
  • 非常感谢!!让我看看:)
  • 如果您遇到关于d 类型的问题,请将行更改为d = dict(row[column_name])
  • 谢谢。我在这里收到此错误:XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'{"0": [['
【解决方案2】:
import ast
import pandas as pd

file = open('file_55966371.csv', 'r')

lines = [ast.literal_eval(line) for line in file]

def clean_lines(line):
    value = [v for v in line.values()]

    l1, l2 = value[0][0]

    line_dict = value[0][1]

    line_dict = {f'key_{key}': value for key, value in line_dict.items()}

    line_dict['list_element1'] = l1
    line_dict['list_element2'] = l2

    return line_dict

to_read = [clean_lines(line) for line in lines]

df = pd.DataFrame(to_read)

我同意@furas 的观点,这看起来很像 JSON,如果这些数据来自某人,最好询问他们是否可以将其以 JSON 格式发送给您。

如果没有,上面的代码可以工作。

  • 打开文件。

  • 读取每一行并将其存储为列表。 ast.literal_eval 允许 Python 从一开始就识别它是一个字典,并将它们存储为 dict 对象。

  • 我创建了一个助手clean_lines 函数。 clean_lines 是更重要的部分。

    1. 获取值(即带有子列表和子字典的列表)
    2. 将列表解压缩成两个变量l1l2
    3. 重命名 subdict 的键(根据您的 key_X 规范) d。将 l1 和 l2 作为条目添加到字典中,基本上将 sublist 和 subdict 合并到一个字典中

一旦你有了一个字典列表,pandas 就能识别它,你可以将它插入到 pd.DataFrame 实例化对象中

【讨论】:

  • 是的,请解释一下这段代码的作用对学习很有帮助
  • 哇,这看起来确实是一种非常有效的方法。我从来没有想过。我正在尝试,我想这需要一些时间,因为 csv 文件大约是 700 mb。我会让你知道输出有多好。非常感谢!! :)
  • 如果它是 700 mb,我真的认为你真的应该问问它是否可以作为 JSON 发送。这将使您的生活轻松 1000 倍
  • 是的,也许你是对的。这个文件是一个非常复杂的过程的输出,计算量很大,我们花了很多时间才得到它。输出这个 json 将需要对生成这个文件的代码进行一些更改。我会检查是否可行,但如果可行,我们现在就这样吧
  • 伙计,他完全符合我的要求,我非常感谢你,认真的。你救了我。而且它并没有花费那么多时间,我认为它或多或少花了 2 分钟。您在解决方案中所做的非常方便。再次感谢!!
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2021-01-18
  • 1970-01-01
  • 2018-12-01
相关资源
最近更新 更多