将 GroupBy 对象 (groupby().size) 转换为字典
Convert a GroupBy object (groupby().size) into a dictionary
这是我尝试的更简单的方法。
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。
就像下面给出的 table。
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.
演示:
部分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}}
更简单的方法是使用 unstack
和 stack
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
这是我尝试的更简单的方法。
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。 就像下面给出的 table。
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.
演示:
部分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}}
更简单的方法是使用 unstack
和 stack
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