将GroupBy对象(groupby()。size)转换为字典

时间:2017-10-19 09:35:51

标签: python pandas numpy dictionary pandas-groupby

这是我尝试更简单的事情。

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。

2 个答案:

答案 0 :(得分:3)

演示:

部分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}}

答案 1 :(得分:1)

更简单的方法是使用unstackstack

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

第A部分

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

B部分

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