我将庞大的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.
答案 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=0
和index2=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]]