group-by - Pandas:使用组索引创建数组

标签 group-by pandas

我正在寻找一种高效的全 Pandas 方式来创建带有组编号的数组(对于原始数据框中的每一行,我想要一个数字来告诉我该行属于哪个组):

df = pandas.DataFrame({'a': [1, 1, 1, 2, 2, 2], 'b': [1, 2, 1, 1, 2, 1]})
groups = df.groupby(['a', 'b'])
group_names = sorted(groups.groups.keys())
group_indices = np.array(df.index)
for index, group in enumerate(group_names):
    group_indices[groups.indices[group]] = index

哪里

In : df 
Out]:
   a  b
0  1  1
1  1  2
2  1  1
3  2  1
4  2  2
5  2  1    

In : groups.indices
Out:
{(1, 1): array([0, 2]),
 (1, 2): array([1]),
 (2, 1): array([3, 5]),
 (2, 2): array([4])}

In : group_indices
Out: array([0, 1, 0, 2, 3, 2])

我的问题是,如果 df 约为 20000x100(64 位 float )并且我按两列进行分组,则内存使用量将超过 6 GB。这远远超出了我的预期。

最佳答案

索引已嵌入到 groupby 对象中

In [52]: groups.grouper.levels
Out[52]: [Int64Index([1, 2], dtype=int64), Int64Index([1, 2], dtype=int64)]

In [53]: groups.grouper.labels
Out[53]: [array([0, 0, 0, 1, 1, 1]), array([0, 1, 0, 0, 1, 0])]

In [57]: l = groups.grouper.labels

In [58]: zip(*l)
Out[58]: [(0, 0), (0, 1), (0, 0), (1, 0), (1, 1), (1, 0)]

In [18]: groups.grouper.group_info
Out[18]: (array([0, 1, 0, 2, 3, 2]), array([0, 1, 2, 3]), 4)

简单的查找操作,因为这些操作已经在分组对象上计算

In [19]: groups.grouper.group_info[0]
Out[19]: array([0, 1, 0, 2, 3, 2])

关于group-by - Pandas:使用组索引创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17403886/

相关文章:

python - 覆盖数据框值

python - 根据第三列中的值,二维图上的点具有不同的颜色

sql - 年月不同等候名单上的客户数量

MySQL嵌套选择查询?

php - Mysql在特定日期之间计数和分组

python - 外部加入数据框python

python-3.x - 按列名拼接 Pandas 数据框

sql - Elasticsearch 分组并获取第一条记录

r - 在 R 上按列值聚合行(总和)的最简单方法是以下类型的数据框?

python - 提高重复 groupby 操作的性能