读取存储在文本文件中的字典并转换为熊猫数据框[重复]

Posted

技术标签:

【中文标题】读取存储在文本文件中的字典并转换为熊猫数据框[重复]【英文标题】:Reading dictionary stored on text file and convert to pandas dataframe [duplicate] 【发布时间】:2019-03-17 19:58:50 【问题描述】:

我有一个文本文件,其中包含一系列字典形式的数据。 我想在熊猫中读取并存储为数据框。 我怎么读。 我读了 pd.csv 但它没有给我数据框。 任何人都可以帮助我吗? 可以下载文本文件Here

谢谢,

泽普,

【问题讨论】:

你有没有尝试过?查看文件,这似乎是一个标准的 json 文件。但是里面的所有数据都是嵌套的,这不适用于 pandas 数据框,因此您需要更改反序列化 json 的形状。 【参考方案1】:

问题是你有一个嵌套的 json。尝试改用 json_normalize:

import requests     #<-- requests library helps us handle http-requests
import pandas as pd

id_ = '1DbfQxBJKHvWO2YlKZCmeIN4al3xG8Wq5'
url = 'https://drive.google.com/uc?authuser=0&id=&export=download'.format(id_)
r = requests.get(url)

df = pd.io.json.json_normalize(r.json())
print(df.columns)

从硬盘驱动器,而 json_normalize 想要读取字典对象而不是路径:

import pandas as pd
import json

with open('myfile.json') as f:
    jsonstr = json.load(f)

df = pd.io.json.json_normalize(jsonstr)

返回:

Index(['average.accelerations', 'average.aerialDuels', 'average.assists',
       'average.attackingActions', 'average.backPasses', 'average.ballLosses',
       'average.ballRecoveries', 'average.corners', 'average.crosses',
       'average.dangerousOpponentHalfRecoveries',
       ...
       'total.successfulLongPasses', 'total.successfulPasses',
       'total.successfulPassesToFinalThird', 'total.successfulPenalties',
       'total.successfulSmartPasses', 'total.successfulThroughPasses',
       'total.successfulVerticalPasses', 'total.throughPasses',
       'total.verticalPasses', 'total.yellowCards'],
      dtype='object', length=171)

另一个想法是将嵌套对象存储在一个系列中(您可以让字典保存这些系列)。

dfs = k: pd.Series(v) for k,v in r.json().items()    
print(dfs.keys()) 
# ['average', 'seasonId', 'competitionId', 'positions', 'total', 'playerId', 'percent'])
print(dfs['percent'])

返回:

aerialDuelsWon                   23.080
defensiveDuelsWon                18.420
directFreeKicksOnTarget           0.000
duelsWon                         33.470
fieldAerialDuelsWon              23.080
goalConversion                   22.581
headShotsOnTarget                 0.000
offensiveDuelsWon                37.250
penaltiesConversion               0.000
shotsOnTarget                    41.940
...
yellowCardsPerFoul               12.500
dtype: float64

数据只有一个条目。

【讨论】:

亲爱的 Anton, 感谢您提供多种解决方案。与您的第一个解决方案相关,如果我想从本地驱动器读取,我使用了 pd.read_csv 和文件的目标。它不起作用。您能否建议如何使用本地驱动器中的文件使用您的第一个解决方案。谢谢 @Zephyr 抱歉去吃午饭了。已更新。 谢谢安东,非常感谢。是的,数据文件只包含 1 行。但是,我是包含嵌套字典的 json 文件。我尝试了相同的方法,但数据框显示不同。如果你不介意,我也可以和你讨论一下吗? @Zephyr 请随时与我联系。 你能简单地告诉我如何展平嵌套的 json。【参考方案2】:

您可以在将数据读取为字符串后将其转换为 json,然后使用pandas.read_json() 将您的 json 转换为数据帧。

例子:

import json
from pandas.io.json import json_normalize

f = open("file.txt", "w+")
contents = f.read()
contents = contents.replace("\n", "")
json_data = json.loads(contents)
df = json_normalize(json.loads(data))

之后您应该将数据作为数据框。

希望这会有所帮助!

【讨论】:

您好,我刚刚尝试过,它显示以下错误:JSONDecodeError: Expecting value: line 1 column 1 (char 0) 那是因为你的换行符。你需要去掉它,检查上面的更新答案。 你的数据也需要标准化。这将要求您使用 normalize_json 感谢 Devdob。感谢您的建议。 很高兴能帮上忙!

以上是关于读取存储在文本文件中的字典并转换为熊猫数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将字典的特定字典转换为熊猫数据框 - 熊猫 [重复]

从箭头格式到熊猫数据框的转换是不是会在堆上重复数据?

读取包含来自csv的单元格中的字典的熊猫数据框

在不使用熊猫的情况下将数据框转换为pyspark中的字典

如何在python中将文本字符串列表转换为熊猫数据框?

如何将包含元组列表的字典中的字典转换为熊猫数据框