【问题标题】:Flatten nested JSON columns in Pandas在 Pandas 中展平嵌套的 JSON 列
【发布时间】:2021-10-09 08:39:04
【问题描述】:

我正在尝试找到一种简单的方法来展平数据框列中存在的嵌套 JSON。数据框列如下所示:

stock   Name            Annual
x       Tesla           {"0": {"date": "2020","dateFormatted": "2020-12-31","sharesMln": "3856.2405","shares": 3856240500},"1": {"date": "2019","dateFormatted": "2019-12-31","sharesMln": "3856.2405","shares": 3856240500}}
y       Google          {"0": {"date": "2020","dateFormatted": "2020-12-31","sharesMln": "2526.4506","shares": 2526450600},"1": {"date": "2019","dateFormatted": "2019-12-31","sharesMln": "2526.4506","shares": 2526450600},"2": {"date": "2018","dateFormatted": "2018-12-31","sharesMln": "2578.0992","shares": 2578099200}}
z       Big Apple       {}

如何将上述数据框转换为:

Stock   Name        date    dateFormatted   sharesMln   shares
x       Tesla       2020    2020-12-31      3856.2405   3856240500
x       Tesla       2019    2019-12-31      3856.2405   3856240500
y       Google      2020    2020-12-31      2526.4506   2526450600
y       Google      2019    2019-12-31      2526.4506   2526450600
y       Google      2018    2018-12-31      2578.0992   2578099200
z       Big Apple   None    None            None        None

我已尝试使用 pd.json_normalize(dataframe['Annual'],max_level=1),但难以获得如上所述的预期结果。

任何指针将不胜感激。

【问题讨论】:

  • 您的 Annual 列不是 json 有效(缺少 { })。 "0": {"date": ...} 应该是 {"0": {"date": ...}}。我是对的?
  • 是的,你是对的。我已经更新了问题以使其成为有效的字典。不过感谢您的回复!

标签: json python-3.x pandas dataframe


【解决方案1】:

从字典中获取值并将列表的每个元素转换为带有explode 的行,同时索引重复。然后,将嵌套的 dict(第一个 dict 的值)扩展到列。最后,您必须将原始数据框与新数据框连接起来。

>>> df

  stock       Name                                             Annual
0     x      Tesla  {'0': {'date': '2020', 'dateFormatted': '2020-...
1     y     Google  {'0': {'date': '2020', 'dateFormatted': '2020-...
2     z  Big Apple                                                 {}
data = df['Annual'].apply(lambda x: x.values()) \
                   .explode() \
                   .apply(pd.Series)

df = df.join(data).drop(columns='Annual')

输出结果:

>>> df

  stock       Name  date dateFormatted  sharesMln        shares
0     x      Tesla  2020    2020-12-31  3856.2405  3.856240e+09
0     x      Tesla  2019    2019-12-31  3856.2405  3.856240e+09
1     y     Google  2020    2020-12-31  2526.4506  2.526451e+09
1     y     Google  2019    2019-12-31  2526.4506  2.526451e+09
1     y     Google  2018    2018-12-31  2578.0992  2.578099e+09
2     z  Big Apple   NaN           NaN        NaN           NaN

【讨论】:

  • 感谢您的好评。我之前遇到了一个 jupyter notebook 问题,但在重置之后,它就像一个魅力。但是,如果您能详细说明explode() 的作用,那就太好了?此外,dropna() 是否会删除具有任何 NaN 值的所有行和列,我们是否可以限制它仅删除具有所有 Nan 值的列?
  • @roller。我更新了我的答案以提供一些细节。我删除了dropna,因为它没用。我在你修复你的专栏之前用过它。
猜你喜欢
  • 2016-12-01
  • 2020-09-27
  • 2023-03-07
  • 1970-01-01
  • 2021-12-03
  • 2021-01-30
  • 2021-12-16
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多