【问题标题】:How to flatten this Dataframe如何展平此数据框
【发布时间】:2021-11-20 11:50:01
【问题描述】:

我有由 ID 和一列组成的数据框。该列在每个单元格中都有字典列表。我想要的是对其进行规范化和展平,因此我将拥有许多从这些字典中出现的列,而不是一列。

                                            LoadNodes
SubProjectId    
56409   [{'Id': 2, 'Description': None, 'Name': None, ...
56410   [{'Id': 2, 'Description': None, 'Name': None, ...
56411   [{'Id': 2, 'Description': None, 'Name': None, ...
56412   [{'Id': 2, 'Description': None, 'Name': None, ...
56414   [{'Id': 3, 'Description': None, 'Name': None, ...
... ...
56505   [{'Id': 2, 'Description': None, 'Name': None, ...
56506   [{'Id': 2, 'Description': None, 'Name': None, ...
56507   [{'Id': 2, 'Description': None, 'Name': None, ...
56508   [{'Id': 2, 'Description': None, 'Name': None, ...
56509   [{'Id': 2, 'Description': None, 'Name': None, ...
87 rows × 1 columns

Dataframe 看起来像这样,我想要的不是列 LoadNodes,而是 Id、Description、Name 等列。当我使用此命令时:

pd.DataFrame(pd.json_normalize(load_only_df['LoadNodes']), index = load_only_df.index)

我收到以下输出...

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45
SubProjectId                                                                                                                                                                                        
56409   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56410   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56411   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56412   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56414   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
56505   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56506   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56507   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56508   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56509   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
87 rows × 46 columns

编辑 1: “df = pd.json_normalize(load_only_df['LoadNodes']) 的输出是什么?NaN 的原因是使用 index = load_only_df.index,如果删除它是什么输出? - 耶斯瑞尔 1 分钟前”

这是您发布的命令的输出。

0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45
0   {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
1   {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
2   {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
3   {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
4   {'Id': 3, 'Description': None, 'Name': None, '...   {'Id': 4, 'Description': None, 'Name': None, '...   {'Id': 5, 'Description': None, 'Name': None, '...   {'Id': 6, 'Description': None, 'Name': None, '...   {'Id': 7, 'Description': None, 'Name': None, '...   {'Id': 8, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
82  {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
83  {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
84  {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
85  {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
86  {'Id': 2, 'Description': None, 'Name': None, '...   None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None    None
87 rows × 46 columns

【问题讨论】:

  • df = pd.json_normalize(load_only_df['LoadNodes']) 的输出是什么? NaNs 的原因是使用index = load_only_df.index,如果删除它,输出是什么?
  • 我在帖子中添加了编辑。
  • 如果您提供一个创建要重塑的结构的数据框的最小示例,也会更容易。至于解决方案,pandas.pydata.org/pandas-docs/stable/reference/api/… 做你需要的吗?

标签: python pandas dataframe nested flatten


【解决方案1】:

IIUC 使用Series.explode:

df = pd.json_normalize(load_only_df['LoadNodes'].explode())

如果重要的还有索引值,这里SubProjectId使用:

load_only_df = pd.DataFrame({'LoadNodes':[[{'Id': 2, 'Description': None, 'Name': None},
                                 {'Id': 7, 'Description': None, 'Name': None},
                                 {'Id': 8, 'Description': None, 'Name': None}],
                                [{'Id': 20, 'Description': None, 'Name': None},
                                 {'Id': 71, 'Description': None, 'Name': None},
                                 {'Id': 80, 'Description': None, 'Name': None}]]
                       }, index=[500, 123])


s = load_only_df['LoadNodes'].explode()
df = pd.json_normalize(s).set_index(s.index)
print(df)
     Id Description  Name
500   2        None  None
500   7        None  None
500   8        None  None
123  20        None  None
123  71        None  None
123  80        None  None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2016-12-09
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多