熊猫如何在已排序的分组依据中找到分组n?

时间:2019-12-18 23:58:32

标签: python pandas

我将庞大的Pandas数据框转换为张量以进行深度学习。现在,我想同时访问数据框和数组中的组n。

例如,如何使用给定的一组排序键访问最终成为数组中第3组的数据框组?

在大型数据集上,将数据帧转换为数组的速度非常慢,因为在数百万行中大约有20万个组。因此,此操作只能执行一次,而不是即时进行,而且我没有泡菜列表。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame({"a"     : np.random.normal(0, 1, 100),
                   "index1": np.random.randint(0, 5, 100),
                   "index2": np.random.randint(0, 5, 100)})

grouped_df = df.groupby(["index1", "index2"])

# convert dataframe to array for e.g. deep learning but never do this operation again (too slow)
array = np.array([group["a"].values for _, group in grouped_df])

# fetch the same sample from the array and the df
array_n = array[3] # this is trivial

# how can I do this in my df?
# grouped_df[3] obviously doesn't work.

2 个答案:

答案 0 :(得分:1)

您可以使用grouped_df.groups属性获取组密钥列表,该属性返回一个字典。然后使用keys()函数获取该字典的键:

In [27]: grouped_df.groups.keys()
Out[27]: dict_keys([(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)])

(这些键的值(index1, index2)对应于该组的index1 / index2值。)

您用于填充array的列表理解将按顺序遍历这些组键,因此结果数组的元素4对应于第四个键:

In [28]: list(grouped_df.groups.keys())[3]
Out[28]: (0, 3)

(指示index1=0index2=3)。现在,您可以将键分配给变量,并使用grouped_df.get_group()方法获取与该键对应的组:

In [29]: my_key = list(grouped_df.groups.keys())[3]

In [30]: grouped_df.get_group(my_key)
Out[30]:
           a  index1  index2
0   1.764052       0       3
14  0.443863       0       3
56  0.066517       0       3
58 -0.634322       0       3
65 -0.401781       0       3
69  0.051945       0       3

最后,从结果中获取列“ a”,并以与列表理解相同的方式获取值:

In [31]: grouped_df.get_group(my_key)['a'].values
Out[31]:
array([ 1.76405235,  0.44386323,  0.06651722, -0.63432209, -0.40178094,
        0.0519454 ])

或者,作为一团糟,

In [32]: grouped_df.get_group(list(grouped_df.groups.keys())[3])['a'].values
Out[32]:
array([ 1.76405235,  0.44386323,  0.06651722, -0.63432209, -0.40178094,
        0.0519454 ])

答案 1 :(得分:0)

您可以像这样创建分组列表:

grouped_df.agg(list).to_numpy().tolist()[3]

输出:

[[1.764052345967664,
  0.44386323274542566,
  0.06651722238316789,
  -0.6343220936809636,
  -0.4017809362082619,
  0.05194539579613895]]