使用 pivot_table 将一列 dict 聚合到一个 dict 列表中 - Pandas

Posted

技术标签:

【中文标题】使用 pivot_table 将一列 dict 聚合到一个 dict 列表中 - Pandas【英文标题】:Aggregate a column of dict into a list of dict with pivot_table - Pandas 【发布时间】:2020-08-29 01:40:24 【问题描述】:

我有一个这样的数据框输入:

data = 'annee': [2015, 2015],
        'medaille': ['Argent', 'Bronze'],
        'categorie': ['Punchs', 'Punchs'],
        'raisonSociale': ['Héritiers H Clément', 'Héritiers H Clément'],
        'Marque': ['Clément', 'Clément'],
        'Medaille_Rhum': ['annee': 2015,
                           'medaille': 'Argent',
                           'produit': np.nan,
                           'Rhum_Name': 'PUNCH CAFE CLEMENT',
                           'Age': np.nan,
                           'labels': np.nan,
                          'annee': 2015,
                           'medaille': 'Bronze',
                           'produit': np.nan,
                           'Rhum_Name': 'PUNCH PINA COLADA CLEMENT',
                           'Age': np.nan,
                           'labels': np.nan],
        'Or': [0, 0],
        'Argent': [1, 0],
        'Bronze': [0, 1],
        'Score': [2, 1]

df = pd.DataFrame(data)

是的,它是加勒比朗姆酒的数据框

我想使用pivot_table() 在带有分值的列中添加“annee”(例如年份)。我实现了它,但我也希望在 dict 列表中聚合 'Rhum_Name' 列。

我尝试了以下代码:

def ListDict(df):
    listDict = []
    listDict.extend(df)
    return listDict


df_ranking = df_ranking.pivot_table(index=['raisonSociale', 'Marque', 'categorie'],
                              columns =['annee', 'Medaille_Rhum'],
                              values = 'Score',
                              fill_value = '',
                              aggfunc = 'annee': sum, 'Medaille_Rhum': ListDict,
                              margins = True, 
                              margins_name = 'Total')

我收到此错误TypeError: unhashable type: 'dict'。我认为这是因为,pivot_table 想要直接遍历字典,但我无法想象如何使它工作。

提前谢谢大家!

【问题讨论】:

【参考方案1】: 将字典转换为数据帧 将'Medaille_Rhum'dicts 的一列)转换为数据框并将其连接回df。 不要试图在pivot_table 中重塑Medaille_Rhum

形成数据框

import pandas as pd
import numpy as np

# create dataframe
df = pd.DataFrame(data)

# convert the dict in medaille_Rhum to a dataframe and join it back to df
df = df.join(pd.DataFrame(df.pop('Medaille_Rhum').values.tolist())['Rhum_Name'])

# display(df)
   annee medaille categorie        raisonSociale   Marque  Or  Argent  Bronze  Score                  Rhum_Name
0   2015   Argent    Punchs  Héritiers H Clément  Clément   0       1       0      2         PUNCH CAFE CLEMENT
1   2015   Bronze    Punchs  Héritiers H Clément  Clément   0       0       1      1  PUNCH PINA COLADA CLEMENT

创建 Medaille_Rhum 列表

medaille_rhum = [v for v in data['Medaille_Rhum']]

# print(medaille_rhum)
['annee': 2015,
  'medaille': 'Argent',
  'produit': nan,
  'Rhum_Name': 'PUNCH CAFE CLEMENT',
  'Age': nan,
  'labels': nan,
 'annee': 2015,
  'medaille': 'Bronze',
  'produit': nan,
  'Rhum_Name': 'PUNCH PINA COLADA CLEMENT',
  'Age': nan,
  'labels': nan]

【讨论】:

以上是关于使用 pivot_table 将一列 dict 聚合到一个 dict 列表中 - Pandas的主要内容,如果未能解决你的问题,请参考以下文章

t4 测试

如何使用熊猫将一列移动到除标题之外的另一列[重复]

EXCEL中,要将一列数据变成两列,该怎样做?

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

如何根据另一列有条件地聚合一列

使用 r 将一列拆分为两列 [重复]