【问题标题】:Group pandas dataframe by a nested dictionary key通过嵌套字典键对熊猫数据框进行分组
【发布时间】:2016-12-17 07:49:31
【问题描述】:

我有一个 pandas 数据框,其中一列是字典类型。这是一个示例数据框:

import pandas as pd
df = pd.DataFrame({'a': [1,2,3], 
                   'b': [4,5,6], 
                   'version': [{'major': 7, 'minor':1}, 
                               {'major':8, 'minor': 5},
                               {'major':7, 'minor':2}] })

df:

   a  b                   version
0  1  4  {'minor': 1, 'major': 7}
1  2  5  {'minor': 5, 'major': 8}
2  3  6  {'minor': 2, 'major': 7}

我正在寻找一种通过该字典键之一对数据帧进行分组的方法;在这种情况下,通过 version 标签中的 ma​​jor 键对 df 数据帧进行分组。

我尝试了一些不同的东西,从将字典键传递给数据帧 groupby 函数,`df.groupby(['version']['major']),这在 ma​​jor 之后不起作用strong> 不是数据框标签的一部分,用于将 version 分配给数据框索引,但到目前为止没有任何效果。我还尝试将字典展平为数据框本身的附加列,但这似乎有其自身的问题。

有什么想法吗?

附:抱歉格式化,这是我的第一个 stackoverflow 问题。

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    选项 1

    df.groupby(df.version.apply(lambda x: x['major'])).size()
    
    version
    7    2
    8    1
    dtype: int64
    

    df.groupby(df.version.apply(lambda x: x['major']))[['a', 'b']].sum()
    

    选项 2

    df.groupby(df.version.apply(pd.Series).major).size()
    
    major
    7    2
    8    1
    dtype: int64
    

    df.groupby(df.version.apply(pd.Series).major)[['a', 'b']].sum()
    

    【讨论】:

    • 我喜欢你的版本
    • 太棒了!我不认为apply 函数可以用作数据框的索引选择器。谢谢,@piRSquared!
    • 我不明白你的问题。考虑提出一个新问题。
    【解决方案2】:

    你可以这样做:

    In [15]: df.assign(major=df.version.apply(pd.Series).major).groupby('major').sum()
    Out[15]:
           a   b
    major
    7      4  10
    8      2   5
    

    【讨论】:

    • 我以前从未见过assign。我今天学到了一些新东西。
    • 是的,assign 会为我节省很多 concatmerge
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2018-04-14
    • 2021-09-17
    • 2021-02-15
    • 2017-08-18
    • 2019-01-11
    • 2016-11-13
    相关资源
    最近更新 更多