【问题标题】:Converting A Dictionary Of Lists That Contain Dictionaries To A Dataframe将包含字典的列表字典转换为数据框
【发布时间】:2018-10-10 19:23:21
【问题描述】:

我已经研究和测试了一整天的方法来做到这一点,虽然我发现了一些有帮助的主题,但到目前为止还没有 100% 有效。我在 Python 文档和 Stack Overflow 上找到了有关如何将字典字典转换为数据帧的信息,但我正在使用的数据结构与这些示例中的数据结构存在显着差异。让我先描述一下我的数据来自哪里以及它的样子。

我正在从在线国际象棋网站的公共 API 接收数据。数据位于 JSON 文件中,包含有关站点成员的信息,并按成员的活跃程度(每周、每月和所有时间)进行细分,并包括成员用户名和他加入的日期。以下是该数据结构的示例:

 {
  "weekly": [
    {
        "username": "string", //username
        "joined": "integer",  //timestamp
    }
  ],
  "monthly": [
    {
        "username": "string", //username
        "joined": "integer",  //timestamp
    }
  ],
  "all_time": [
    {
        "username": "string", //username
        "joined": "integer",  //timestamp
    }
  ]
}

我的目标是将这些数据放入 Jupyter Notebook 中的 Pandas df 中,这样我就可以创建图表来显示成员的活跃程度。

显然,使用 pd.DataFrame.from_dict(data) 会引发错误。我需要解析数据并将其以 Pandas 可以处理的格式写入文件。到目前为止,我的代码正在将用户名和连接数据写入一个名为 members 的文件。我需要解决两件事。 1. 我需要包含高级关键数据(周、月和所有时间)并将其包含在我的成员文件中。每个密钥应该只在文件中出现一次,并且后面是该类别的所有用户数据(即在该时间段内活跃的用户)。 2. 我需要弄清楚如何格式化文件中的数据,以便 Pandas 可以将其放入 df 中。目前,用户名和连接数据以空格作为分隔符写入文件。 这是代码。它运行没有错误,所以如果你愿意,你可以运行它。

import requests 
import json



def getPlayerNames():


    headers = {
        'User-Agent': ' @Knightburgler/1.0 (Python 3.x)',
    'Accept-encoding': 'gzip'
    }


    url = 'https://api.chess.com/pub/club/team-iowa/members'
    response = requests.get(url, headers)

    response.raise_for_status()
    data = response.json()

    fp = open('members.txt', 'w')
    for period in data["weekly"], data["monthly"], data["all_time"]:
        for k in period:
            fp.write(k['username'] + " " + str(k['joined']) + " ")
    fp.close()

def main():
    getPlayerNames()


if __name__ == "__main__":
    main()

# eof

将数据写入 CSV 文件后,格式应如下所示:

用户名、加入日期、期间

【问题讨论】:

  • 你能包含你想要的输出数据帧结构吗?
  • 我建议消除大部分内容并创建一个更小的解释、输入和所需输出

标签: python pandas dictionary dataframe


【解决方案1】:

您可以使用字典列表创建 DataFrame。如下

rows = []
for period in data:
  for k in data[period]:
    rows.append({'username': k['username'], 'joined':k['joined'], 'period': period})

df = pd.DataFrame(rows)

一旦你有了一个 DataFrame。保存它很简单:

df.to_csv(filename)

【讨论】:

  • 蒂娜,这个解决方案非常适合我。我不能感谢你!它不仅有效,而且比我想象的要简单得多。谢谢!
  • 蒂娜,我发现你与我分享的代码很有趣。这没什么大不了的,但我认为将“句点”字段放在 CSV 文件中的第一位会更好。但是,无论我如何重新排列 rows.append() 代码行,连接字段都保持在相同的位置。那会是因为 df=pd.DataFrame(rows) 函数调用吗?只是好奇。
  • @Willyd 很高兴它有帮助!当你创建 DataFrame 时,你可以按照你想要的顺序传递列名:pd.DataFrame(rows, columns=['period', 'joined', 'username'])
猜你喜欢
  • 2019-04-21
  • 2018-10-10
  • 2022-10-13
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
相关资源
最近更新 更多