使用 pivot_table - Pandas 将一列字典聚合到一个字典列表中
Aggregate a column of dict into a list of dict with pivot_table - Pandas
我有一个这样的数据框输入:
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'(例如年份)。我实现了它,但我还希望将 '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
想直接遍历字典,但我无法想象如何让它工作。
提前谢谢大家!
- 将字典转换为数据框
- 将
'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}]
我有一个这样的数据框输入:
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'(例如年份)。我实现了它,但我还希望将 '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
想直接遍历字典,但我无法想象如何让它工作。
提前谢谢大家!
- 将字典转换为数据框
- 将
'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}]