【问题标题】:Pandas: How to group by column values when column values are dicts?Pandas:当列值是字典时,如何按列值分组?
【发布时间】:2019-12-11 12:17:05
【问题描述】:

我正在做一个练习,当前的要求是“找到前 10 个主要项目主题(使用列 'mjtheme_namecode')”。

我的第一个想法是做group_by,然后对组进行计数和排序。

但是,此列中的值是字典列表,例如

[{'code': '1', 'name': 'Economic management'},
 {'code': '6', 'name': 'Social protection and risk management'}]

我不能(显然)将这些分组,至少不能与group_by 分组。我收到一个错误。

TypeError: unhashable type: 'list'

有什么诀窍吗?我猜测类似于this question

(我可以按具有字符串值并与该列 1:1 匹配的另一列分组,但练习是特定的。)

df.head()

【问题讨论】:

标签: python pandas grouping


【解决方案1】:

有两个步骤可以解决您的问题:

使用pandas==0.25

  1. 扁平化dict列表
  2. 在列中转换字典:

第 1 步

df = df.explode('mjtheme_namecode')

第 2 步

df = df.join(pd.DataFrame(df['mjtheme_namecode'].values.tolist())

新增:如果dict有多个层次结构,可以尝试使用json_normalize

from pandas.io.json import json_normalize

df = df.join(json_normalize(df['mjtheme_namecode'].values.tolist())

这里唯一的问题是 pd.explode 将复制所有其他列(以防出现问题)。

使用样本数据

x = [
    [1,2,[{'a':1, 'b':3},{'a':2, 'b':4}]],
    [1,3,[{'a':5, 'b':6},{'a':7, 'b':8}]]
]

df = pd.DataFrame(x, columns=['col1','col2','col3'])

Out[1]:
    col1    col2    col3
0   1       2      [{'a': 1, 'b': 3}, {'a': 2, 'b': 4}]
1   1       3      [{'a': 5, 'b': 6}, {'a': 7, 'b': 8}]


## Step 1
df.explode('col3')
Out[2]:
    col1    col2    col3
0   1        2      {'a': 1, 'b': 3}
0   1        2      {'a': 2, 'b': 4}
1   1        3      {'a': 5, 'b': 6}
1   1        3      {'a': 7, 'b': 8}

## Step 2
df = df.join(pd.DataFrame(df['col3'].values.tolist()))
Out[3]:

    col1    col2    col3                a   b
0   1       2      {'a': 1, 'b': 3}     1   3
0   1       2      {'a': 2, 'b': 4}     1   3
1   1       3      {'a': 5, 'b': 6}     2   4
1   1       3      {'a': 7, 'b': 8}     2   4

## Now you can group with the new variables

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2015-09-05
    • 2018-03-08
    • 2015-10-18
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多