【问题标题】:Explode List containing many dictionaries in Pandas dataframe在 Pandas 数据框中包含许多字典的爆炸列表
【发布时间】:2020-01-25 09:10:07
【问题描述】:

我有一个如下所示的数据集(在数据框中):

**_id** **paper_title**   **references**                                                                  **full_text**
 1         XYZ              [{'abc':'something','def':'something'},{'def':'something'},...many others]       something
 2         XYZ              [{'abc':'something','def':'something'},{'def':'something'},...many others]       something
 3         XYZ              [{'abc':'something'},{'def':'something'},...many others]                         something

预期:

**_id** **paper_title**   **abc**    **def**                               **full_text**
   1         XYZ          something  something                               something               
                          something  something
                          .    
                          .
                         (all the dic in list with respect to_id column)
   2         XYZ          something  something                               something               
                          something  something
                          .    
                          .
                         (all the dic in list with respect to_id column)

我尝试df['column_name'].apply(pd.Series).apply(pd.Series) 将列表和字典拆分为数据框的列,但没有帮助,因为它没有拆分字典。

我的数据框的第一行: df.head(1)

【问题讨论】:

  • 如果您可以发布您共享的示例数据帧的df.head().to_dict() 的结果,与预期的输出相同,那么我们可以复制这个问题,谢谢
  • 如果您提供的代码包含您的 DataFrame 并且有人可以插入控制台并使用该代码,那么您将很快得到答案。
  • @Karthik V 我添加了原始数据框的屏幕截图。我希望它有所帮助。

标签: python pandas dataframe machine-learning data-cleaning


【解决方案1】:

假设您的原始 DataFrame 是一个字典列表,其中包含一个键:值对和一个名为“reference”的键:

print(df)                                                                                                                                
   id paper_title                                         references       full_text
0   1         xyz  [{'reference': 'description1'}, {'reference': ...       some text
1   2         xyz  [{'reference': 'descriptiona'}, {'reference': ...       more text
2   3         xyz  [{'reference': 'descriptioni'}, {'reference': ...  even more text

然后您可以使用concat 将您的引用与它们的索引分开:

df1 = pd.concat([pd.DataFrame(i) for i in df['references']], keys = df.index).reset_index(level=1,drop=True)
print(df1)                                                                                                                               
        reference
0    description1
0    description2
0    description3
1    descriptiona
1    descriptionb
1    descriptionc
2    descriptioni
2   descriptionii
2  descriptioniii

然后使用DataFrame.join 将列重新连接到它们的索引上:

df = df.drop('references', axis=1).join(df1).reset_index(drop=True)
print(df)                                                                                                                                
   id paper_title       full_text       reference
0   1         xyz       some text    description1
1   1         xyz       some text    description2
2   1         xyz       some text    description3
3   2         xyz       more text    descriptiona
4   2         xyz       more text    descriptionb
5   2         xyz       more text    descriptionc
6   3         xyz  even more text    descriptioni
7   3         xyz  even more text   descriptionii
8   3         xyz  even more text  descriptioniii

【讨论】:

  • 谢谢@dkhara 我认为它会工作,但我找到了最简单的方法。
  • 在加入数据框时,参考列的值为整列的 NaN (imgur.com/MrmXx3f)。我不知道发生了什么。你能解释一下[pd.DataFrame(i) for i in df['references']这里发生了什么吗?
  • [pd.DataFrame(i) for i in df['references'] 是列表理解的一个示例,其中大括号中的每个引用都转换为 DataFrame。然后,使用pandas.concat 连接这些 DataFrame
【解决方案2】:

在阅读了大量熊猫文档后,我发现explode methodapply(pd.Series) 一起申请是我在问题中寻找的最简单的方法。

代码如下:

df = df.explode('reference')

# 将列表分解为子集列的行

df = df['reference'].apply(pd.Series).merge(df, left_index=True, right_index=True, how ='outer')

# 将 Dataframe 单元格内的列表拆分为行,并与集合论中的 (AUB) 等原始数据帧合并

旁注:合并时在列中查找唯一值,因为会有许多列具有重复值

我希望这有助于数据框/系列的列具有包含多个字典的列表并希望将多个字典键的列表拆分为以值作为行的新列。

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2020-04-10
    • 2018-11-13
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多