【发布时间】:2015-12-17 11:03:37
【问题描述】:
假设我有一个这样的列表的 Python 字典:
{'Grp': ['2' , '6' , '6' , '5' , '5' , '6' , '6' , '7' , '7' , '6'],
'Nums': ['6.20', '6.30', '6.80', '6.45', '6.55', '6.35', '6.37', '6.36', '6.78', '6.33']}
我可以使用itertools.groupby轻松地对数字和组键进行分组:
from itertools import groupby
for k, l in groupby(zip(di['Grp'], di['Nums']), key=lambda t: t[0]):
print k, [t[1] for t in l]
打印:
2 ['6.20']
6 ['6.30', '6.80'] # one field, key=6
5 ['6.45', '6.55']
6 ['6.35', '6.37'] # second
7 ['6.36', '6.78']
6 ['6.33'] # third
注意6 键被分成三个独立的组或字段。
现在假设我的 dict 具有等效的 Pandas DataFrame(相同的数据、相同的列表顺序和相同的键):
Grp Nums
0 2 6.20
1 6 6.30
2 6 6.80
3 5 6.45
4 5 6.55
5 6 6.35
6 6 6.37
7 7 6.36
8 7 6.78
9 6 6.33
如果我使用 Pandas 的 groupby,我看不到如何逐组迭代。相反,Pandas 按键值分组:
for e in df.groupby('Grp'):
print e
打印:
('2', Grp Nums
0 2 6.20)
('5', Grp Nums
3 5 6.45
4 5 6.55)
('6', Grp Nums
1 6 6.30
2 6 6.80 # df['Grp'][1:2] first field
5 6 6.35 # df['Grp'][5:6] second field
6 6 6.37
9 6 6.33) # df['Grp'][9] third field
('7', Grp Nums
7 7 6.36
8 7 6.78)
注意6 组键是捆绑在一起的;不是单独的组。
我的问题:有没有一种等效的方式来使用 Pandas 的 groupby,例如,6 会以与 Python 的 groupby 相同的方式分为三个组?
我试过了:
>>> df.reset_index().groupby('Grp')['index'].apply(lambda x: np.array(x))
Grp
2 [0]
5 [3, 4]
6 [1, 2, 5, 6, 9] # I *could* do a second groupby on this...
7 [7, 8]
Name: index, dtype: object
但它仍然按整体 Grp 键分组,我需要在 nd.array 上执行第二个 groupby 以将每个键的子组分开。
【问题讨论】:
-
有趣的问题。在这种情况下应该返回什么对象呢?我的意思是,
groupby旨在返回具有唯一键的对象,但这在这里是不可能的。你想如何区分重复键(6s的不同组)? -
有时键的不间断运行是数据的另一个元素。另一个键的存在表明了一些事情。如:时间间隔或数据读数。一旦您在系列中有不同的间隔,那就是不同的领域。我想要类似键的统一运行——就像 itertools 一样。
-
有一种方法here 可以提供解决方案。