【问题标题】:Convert a GroupBy object (groupby().size) into a dictionary将 GroupBy 对象 (groupby().size) 转换为字典
【发布时间】:2018-03-31 07:34:19
【问题描述】:

这是我尝试的更简单的方法。

demo = pd.DataFrame(data=np.array([["APPLE", "APPLE", "APPLE", "MANGO", "MANGO"],
                             ["DOWN", "DOWN", "DOWN", "UP", "DOWN"]]))

demo = demo.T
demo.columns = ['FRUIT', 'DIRECTION']

这是上面的数据框的样子

    FRUIT   DIRECTION
0   APPLE   DOWN
1   APPLE   DOWN
2   APPLE   DOWN
3   MANGO   UP
4   MANGO   DOWN

现在

labels = demo["DIRECTION"]
l, v = np.unique(labels, return_counts=True)
d = dict(zip(l, v))
print(d)

这为我提供了“DIRECTIONS”列的唯一计数。

{'DOWN': 3, 'UP': 2}

现在,如果我想找到按“DIRECTION”列分组的“FRUIT”列的计数频率怎么办。

我确实这样做了。

print(demo.groupby(['FRUIT', 'DIRECTION']).size())

这给了我,

FRUIT  DIRECTION
APPLE  DOWN         3
MANGO  DOWN         1
       UP           1

我对上述输出有疑问。

我希望能够做到以下几点:

a) APPLE 在 UP 方向上没有任何内容,所以我希望它显示为 0。 如下表所示。

FRUIT  DIRECTION
APPLE  DOWN         3
       UP           0
MANGO  DOWN         1
       UP           1

b) 我希望能够像这样将它创建到字典中

{'APPLE': {DOWN: 3, UP: 0}, 'MANGO': {DOWN: 1, UP: 1}}

复制上述字典的任何其他方式也可以。我正在使用 Python 3。

【问题讨论】:

    标签: python pandas numpy dictionary pandas-groupby


    【解决方案1】:

    演示:

    部分a

    In [19]: x = demo.groupby(['FRUIT', 'DIRECTION']).size()
    
    In [20]: x
    Out[20]:
    FRUIT  DIRECTION
    APPLE  DOWN         3
    MANGO  DOWN         1
           UP           1
    dtype: int64
    
    In [21]: idx = pd.MultiIndex.from_product((df.FRUIT.unique(), df.DIRECTION.unique()))
    
    In [22]: x.reindex(idx).fillna(0)
    Out[22]:
    APPLE  DOWN    3.0
           UP      0.0
    MANGO  DOWN    1.0
           UP      1.0
    dtype: float64
    

    部分b

    In [79]: r = x.reindex(idx).fillna(0)
    
    In [80]: r.reset_index() \
              .groupby('level_0').apply(lambda x: dict(zip(x['level_1'],x[0]))) \
              .to_dict()
    Out[80]: {'APPLE': {'DOWN': 3.0, 'UP': 0.0}, 'MANGO': {'DOWN': 1.0, 'UP': 1.0}}
    

    【讨论】:

    • 非常感谢.. 我如何完成 b 部分?对不起..我还在学习使用字典。
    • @josh 当我看到 Max 的回答与 exactly 相同时,我正要发帖。我别无选择,只能投票。
    • @Abhishek,我还为b 部分添加了解决方案;-)
    • @MaxU 谢谢好心的先生!你怎么得到这个好?有什么超深度的书推荐吗?
    • @Abhishek,我的学习方式是 - 尝试回答关于 SO 的问题。当您尝试回答它们时,您会自动搜索/学习您还不知道的东西。这需要时间,但它非常有效。当然,Python/Pandas 在线文档和教程非常有用
    【解决方案2】:

    更简单的方法是使用unstackstack

    In [4403]: x = demo.groupby(['FRUIT', 'DIRECTION']).size().unstack(fill_value=0)
    

    第一部分

    In [4404]: x.stack()
    Out[4404]:
    FRUIT  DIRECTION
    APPLE  DOWN         3
           UP           0
    MANGO  DOWN         1
           UP           1
    dtype: int64
    

    第二部分

    In [4405]: x.to_dict('index')
    Out[4405]: {'APPLE': {'DOWN': 3, 'UP': 0}, 'MANGO': {'DOWN': 1, 'UP': 1}}
    

    详情

    In [4406]: x
    Out[4406]:
    DIRECTION  DOWN  UP
    FRUIT
    APPLE         3   0
    MANGO         1   1
    

    【讨论】:

    • 是的,看起来很棒!
    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多