찾다
백엔드 개발파이썬 튜토리얼Python은 중첩된 JSON을 도입하여 몇 초 만에 데이터프레임으로 변환합니다!

Python Tutorial이 칼럼에서는 JSON을 중첩하는 방법을 소개합니다

Python은 중첩된 JSON을 도입하여 몇 초 만에 데이터프레임으로 변환합니다!

권장(무료): Python Tutorial

API를 호출하면 문서 데이터베이스가 중첩된 상태로 반환됩니다. JSON 개체에서 Python을 사용하여 중첩 구조의 키를 열로 변환하려고 하면 pandas에 로드된 데이터는 종종 다음 결과: API和文档数据库会返回嵌套的JSON对象,当我们使用Python尝试将嵌套结构中的键转换为列时,数据加载到pandas中往往会得到如下结果:

df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])
说明:这里results是一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,后面会看到JSON嵌套结构。

问题在于API返回了嵌套的JSON结构,而我们关心的键在对象中确处于不同级别。

嵌套的JSON结构张成这样的。

而我们想要的是下面这样的。

下面以一个API返回的数据为例,API通常包含有关字段的元数据。假设下面这些是我们想要的字段。

  • key:JSON密钥,在第一级的位置。
  • summary:第二级的“字段”对象。
  • status name:第三级位置。
  • statusCategory name:位于第4个嵌套级别。

如上,我们选择要提取的字段在issues列表内的JSON结构中分别处于4个不同的嵌套级别,一环扣一环。

{
  "expand": "schema,names",
  "issues": [
    {
      "fields": {
        "issuetype": {
          "avatarId": 10300,
          "description": "",
          "id": "10005",
          "name": "New Feature",
          "subtask": False
        },
        "status": {
          "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
          "id": "5",
          "name": "Resolved",
          "statusCategory": {
            "colorName": "green",
            "id": 3,
            "key": "done",
            "name": "Done",
          }
        },
        "summary": "Recovered data collection Defraglar $MFT problem"
      },
      "id": "11861",
      "key": "CAE-160",
    },
    {
      "fields": { 
... more issues],
  "maxResults": 5,
  "startAt": 0,
  "total": 160
}

一个不太好的解决方案

一种选择是直接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,然后再调用.applyDataFrame中的新列。

为获取我们想要的几个字段,首先我们提取fields键内的对象至列:

df = (
    df["fields"]
    .apply(pd.Series)
    .merge(df, left_index=True, right_index = True)
)

从上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套对象中。

下面是提取issuetype中的name的一种方法。

# 提取issue type的name到一个新列叫"issue_type"
df_issue_type = (
    df["issuetype"]
    .apply(pd.Series)
    .rename(columns={"name": "issue_type_name"})["issue_type_name"]
)
df = df.assign(issue_type_name = df_issue_type)

像上面这样,如果嵌套层级特别多,就需要自己手撸一个递归来实现了,因为每层嵌套都需要调用一个像上面解析并添加到新列的方法。

对于编程基础薄弱的朋友,手撸一个其实还挺麻烦的,尤其是对于数据分析师,着急想用数据的时候,希望可以快速拿到结构化的数据进行分析。

下面东哥分享一个pandas的内置解决方案。

内置的解决方案

pandas中有一个牛逼的内置功能叫 .json_normalize

pandas的文档中提到:将半结构化JSON数据规范化为平面表。

前面方案的所有代码,用这个内置功能仅需要3行就可搞定。步骤很简单,懂了下面几个用法即可。

确定我们要想的字段,使用 . 符号连接嵌套对象。

将想要处理的嵌套列表(这里是results["issues"])作为参数放进 .json_normalize 中。

过滤我们定义的FIELDS列表。

FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]
df = pd.json_normalize(results["issues"])
df[FIELDS]

没错,就这么简单。

其它操作

记录路径

除了像上面那样传递results["issues"]列表之外,我们还使用record_path参数在JSON对象中指定列表的路径。

# 使用路径而不是直接用results["issues"]
pd.json_normalize(results, record_path="issues")[FIELDS]

自定义分隔符

还可以使用sep参数自定义嵌套结构连接的分隔符,比如下面将默认的“.”替换“-”。

### 用 "-" 替换默认的 "."
FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
pd.json_normalize(results["issues"], sep = "-")[FIELDS]

控制递归

如果不想递归到每个子对象,可以使用max_level参数控制深度。在这种情况下,由于statusCategory.name字段位于JSON对象的第4级,因此不会包含在结果DataFrame中。

# 只深入到嵌套第二级
pd.json_normalize(results, record_path="issues", max_level = 2)

下面是.json_normalizepandasrrreee

설명: 여기서 결과는 큰 사전이고, Issue는 결과의 키이며, Issue의 값은 중첩된 JSON 개체 사전 목록입니다. 나중에 JSON 중첩 구조를 볼 수 있습니다.
문제는 API가 중첩된 JSON 구조를 반환하고 우리가 관심을 갖는 키가 실제로 객체의 다른 수준에 있다는 것입니다. 🎜🎜중첩된 JSON 구조는 다음과 같습니다. 🎜🎜그리고 우리가 원하는 것은 이런 것입니다. 🎜🎜다음은 API에서 반환한 데이터를 예로 들어 보겠습니다. API에는 일반적으로 관련 필드에 대한 메타데이터가 포함되어 있습니다. 이것이 우리가 원하는 필드라고 가정해 보겠습니다. 🎜
  • 키: 첫 번째 수준의 JSON 키입니다.
  • 요약: 두 번째 수준의 "필드" 개체입니다.
  • 상태 이름: 세 번째 수준 위치.
  • statusCategory 이름: 4번째 중첩 수준에 위치합니다.
🎜위와 같이 추출하기로 선택한 필드는 문제 목록의 JSON 구조에서 차례로 4개의 서로 다른 중첩 수준에 있습니다. 🎜rrreee🎜🎜별로 좋지 않은 해결책🎜🎜🎜한 가지 옵션은 직접 코딩하고 특정 필드를 찾는 함수를 작성하는 것이지만 문제는 이 함수를 각 중첩 필드에 대해 호출한 다음 를 호출해야 한다는 것입니다. <code>DataFrame의 새 열에를 적용합니다. 🎜🎜원하는 여러 필드를 얻으려면 먼저 필드 키에서 열의 개체를 추출합니다. 🎜rrreee🎜위 표에서 볼 수 있듯이 요약만 사용할 수 있고 이슈 유형, 상태 등은 여전히 ​​중첩되어 묻혀 있습니다. 사물. 🎜🎜다음은 issuetype에서 이름을 추출하는 방법입니다. 🎜rrreee🎜위처럼 중첩 수준이 너무 많으면 재귀를 직접 구현해야 합니다. 각 중첩 수준마다 위와 같은 메서드를 호출하여 구문 분석하고 새 열에 추가해야 하기 때문입니다. 🎜🎜프로그래밍 기초가 약한 친구들에게는 사실 하나 고르기가 상당히 까다롭습니다. 특히 데이터 분석가의 경우 데이터 사용에 대한 불안감이 있을 때 분석을 위해 구조화된 데이터를 빨리 얻고 싶어합니다. 🎜🎜이제 당 형제는 pandas를 위한 내장 솔루션을 공유합니다. 🎜🎜🎜내장 솔루션🎜🎜🎜pandas에는 .json_normalize라는 멋진 내장 함수가 있습니다. 🎜🎜pandas 문서에서는 반구조화된 JSON 데이터를 플랫 테이블로 정규화한다고 언급합니다. 🎜🎜이 내장 함수를 사용하면 이전 솔루션의 모든 코드를 단 3줄로 완성할 수 있습니다. 단계는 매우 간단합니다. 다음 사용법을 이해하세요. 🎜🎜원하는 필드를 결정하고 . 기호를 사용하여 중첩된 개체를 연결합니다. 🎜🎜처리하려는 중첩 목록(여기서는 results["issues"])을 매개변수로 .json_normalize에 넣습니다. 🎜🎜우리가 정의한 FIELDS 목록을 필터링하세요. 🎜rrreee🎜네, 정말 간단해요. 🎜🎜🎜기타 작업🎜🎜🎜🎜레코드 경로🎜🎜🎜위와 같이 results["issues"] 목록을 전달하는 것 외에도 다음에서 record_path 매개변수를 사용합니다. JSON 객체에 지정된 목록의 경로입니다. 🎜rrreee🎜🎜사용자 정의 구분 기호🎜🎜🎜 sep 매개 변수를 사용하여 중첩 구조 연결에 대한 구분 기호를 사용자 정의할 수도 있습니다. 예를 들어 아래에서 기본값 "."을 "-"로 바꿉니다. 🎜rrreee🎜🎜재귀 제어🎜🎜🎜각 하위 개체로 재귀하지 않으려면 max_level 매개변수를 사용하여 깊이를 제어할 수 있습니다. 이 경우 statusCategory.name 필드는 JSON 개체의 레벨 4에 있으므로 결과 DataFrame에 포함되지 않습니다. 🎜rrreee🎜다음은 .json_normalize에 대한 pandas 공식 문서 설명입니다. 이해가 안 되시면 이번에는 동 형제님이 직접 배워 보세요. 여기에 소개합니다. 🎜🎜pandas 공식 문서: https://pandas.pydata.org/pan...🎜

위 내용은 Python은 중첩된 JSON을 도입하여 몇 초 만에 데이터프레임으로 변환합니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.