Python groupby索引嵌套字典

Python groupby索引嵌套字典,python,pandas,Python,Pandas,要获取索引的嵌套字典,我将执行以下操作: >>> df = pd.DataFrame({'a': [1,1,1,2,2,3,3,3,3,4,4,5,5], 'b': [0,1,1,0,1,0,0,1,4,1,0,3,0], 'v': [2,4,3,7,6,5,9,3,2,4,5,2,3]}) >>> df a b v 0 1 0 2 1 1 1 4 2 1 1 3 3 2 0 7 4 2 1 6 5

要获取索引的嵌套字典,我将执行以下操作:

>>> df = pd.DataFrame({'a': [1,1,1,2,2,3,3,3,3,4,4,5,5], 
'b': [0,1,1,0,1,0,0,1,4,1,0,3,0], 
'v': [2,4,3,7,6,5,9,3,2,4,5,2,3]})
>>> df
    a  b  v
0   1  0  2
1   1  1  4
2   1  1  3
3   2  0  7
4   2  1  6
5   3  0  5
6   3  0  9
7   3  1  3
8   3  4  2
9   4  1  4
10  4  0  5
11  5  3  2
12  5  0  3
>>> df.groupby(by =['a', 'b']).groups
{(2, 0): [3], (5, 0): [12], (3, 0): [5, 6], (5, 1): [11], (1, 0): [0], (3, 
1): [7, 8], (4, 1): [9], (1, 1): [1, 2], (2, 1): [4], (4, 0): [10]}
这是通过改编@piRSquared的答案实现的。
有没有更直接的方法达到这个结果

使用两个
groupby
,我不确定以下解决方案的效率

>>> df['idx'] = df.index
>>> {k: {kk: vv for kk, vv in v.items() if vv is not None} for k, v in 
df.groupby(by =['a','b']).idx.apply(list).unstack().to_dict('index').items()}
{1: {0: [0], 1: [1, 2]}, 2: {0: [3], 1: [4]}, 3: {0: [5, 6], 1: [7, 8]}, 4: 
{0: [10], 1: [9]}, 5: {0: [12], 1: [11]}}

使用两个
groupby
,我不确定以下解决方案的效率

>>> df['idx'] = df.index
>>> {k: {kk: vv for kk, vv in v.items() if vv is not None} for k, v in 
df.groupby(by =['a','b']).idx.apply(list).unstack().to_dict('index').items()}
{1: {0: [0], 1: [1, 2]}, 2: {0: [3], 1: [4]}, 3: {0: [5, 6], 1: [7, 8]}, 4: 
{0: [10], 1: [9]}, 5: {0: [12], 1: [11]}}

是的,它确实做到了,但是速度慢了2倍。如果不久没有其他人出现,我将接受你的答复。谢谢你是的,它确实起作用,但速度慢了2倍。如果不久没有其他人出现,我将接受你的答复。谢谢你有这行:
x=df.groupby(by=['a','b']).idx.apply(list).unstack().to_dict('index').items()
对吗?为什么不干脆
dict(x)
呢?因为在这种情况下,你会在嵌套的
dict
中得到
a
b
键的所有可能组合,这些组合的
None
值在
col
v
,导致一个
dict
是实际需要大小的几倍,这是我想要避免的。我不确定这是真的。同样,没有运行代码但
为None
仅当
vv
None
时才会捕获,并且不会捕获e.gb的
np.nans
,但这是我所期望的行为;如果存在
a
-
b
组合,我希望它的索引位于
dict
中,即使
v
值为
np.nan
。但是如果在我的
df
中没有给定的组合,那么我就不想在我的
dict
中使用它,此外,因为您在原始注释中引用的
x
的值是索引,我不知道它们怎么会变成
np.nan
s,但是如果你有其他想法,请告诉我你有这样一行:
x=df.groupby(by=['a','b']).idx.apply(list).unstack().to_dict('index').items()
对吗?为什么不干脆
dict(x)
呢?因为在这种情况下,你会在嵌套的
dict
中得到
a
b
键的所有可能组合,这些组合的
None
值在
col
v
,导致一个
dict
是实际需要大小的几倍,这是我想要避免的。我不确定这是真的。同样,没有运行代码但
为None
仅当
vv
None
时才会捕获,并且不会捕获e.gb的
np.nans
,但这是我所期望的行为;如果存在
a
-
b
组合,我希望它的索引位于
dict
中,即使
v
值为
np.nan
。但是如果在我的
df
中没有给定的组合,那么我就不想在我的
dict
中有它。此外,因为你在原始评论中引用的
x
的值是索引,我不确定它们怎么会变成
np.nan
s,但是如果你不这么认为,请告诉我