如何在 groupby 2 列之后保留 DataFrame 的原始索引?

Posted

技术标签:

【中文标题】如何在 groupby 2 列之后保留 DataFrame 的原始索引?【英文标题】:How to keep original index of a DataFrame after groupby 2 columns? 【发布时间】:2018-08-19 08:37:09 【问题描述】:

执行 groupby 后,有什么方法可以保留大型数据框的原始索引?我需要这样做的原因是因为我需要将内部合并回我的原始 df(在我的 groupby 之后)以重新获得那些丢失的列。并且索引值是执行合并回的唯一“唯一”列。有谁知道我如何做到这一点?

我的 DataFrame 很大。 我的 groupby 看起来像这样:

df.groupby(['col1', 'col2']).agg('col3': 'count').reset_index()

这会从我想要保留的原始数据框中删除我的原始索引。

【问题讨论】:

当你对数据进行分组时,你希望每一行有什么索引?每个组很可能会在原始数据框中组合许多行。例如,您是否期望与该组相关的索引列表? 是的!这就是我要找的 【参考方案1】:

如果您想保留原始索引,则不应使用“reset_index()”

【讨论】:

那个不行,即使reset_index()不存在,groupby也不保留原来的索引 你是对的,它不会解决问题。我的错。让我看看能不能找到解决办法。【参考方案2】:

您可以通过reset_index 将您的索引提升到一列。然后通过aggcount 聚合将您的索引聚合到一个元组中。

下面是一个最小的例子。

import pandas as pd, numpy as np

df = pd.DataFrame(np.random.randint(0, 4, (50, 5)),
                  index=np.random.randint(0, 4, 50))

df = df.reset_index()

res = df.groupby([0, 1]).agg(2: 'count', 'index': lambda x: tuple(x)).reset_index()

#     0  1  2            index
# 0   0  0  4     (2, 0, 0, 2)
# 1   0  1  4     (0, 3, 1, 1)
# 2   0  2  1             (1,)
# 3   0  3  1             (3,)
# 4   1  0  4     (1, 2, 1, 3)
# 5   1  1  2           (1, 3)
# 6   1  2  4     (2, 1, 2, 2)
# 7   1  3  1             (2,)
# 8   2  0  5  (0, 3, 0, 2, 2)
# 9   2  1  2           (0, 2)
# 10  2  2  5  (1, 1, 3, 3, 2)
# 11  2  3  2           (0, 1)
# 12  3  0  4     (0, 3, 3, 3)
# 13  3  1  4     (1, 3, 0, 1)
# 14  3  2  3        (3, 2, 1)
# 15  3  3  4     (3, 3, 2, 1)

【讨论】:

据我了解 OPs 问题.. 这是正确答案。 确实是正确答案1【参考方案3】:

我认为您正在寻找这种情况下的转换:

df['count'] = df.groupby(['col1', 'col2'])['col3'].transform('count')

【讨论】:

根据 cmets,他想知道哪些索引对每个组有贡献 这似乎是从 Pandas 0.25.1 开始的最佳解决方案 有没有这样一个简单的解决方案,其性能类似于在没有转换的情况下丢失索引?我正在使用 groups.last()groups.transform('last') 慢得多。熊猫 1.3.4 @jayen 我不明白你的问题。 groups.transform('last') 很慢。 groups.last() 很快。有没有一种快速的方法来使用 groupby 并保持索引?我设法通过将索引复制到列然后在 groupby 之后恢复它来做到这一点。几乎和groups.last()一样快

以上是关于如何在 groupby 2 列之后保留 DataFrame 的原始索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark sql 2.1.0 中的 Dataset<Row> 上获取 groupby 之后的所有列

进行 groupby 时保留其他列

如何为 size() 列分配名称?

在 groupBy scala spark 之后保留最近的行

在csv,pandas中的groupby之后创建自定义列

如何使用 groupby 调整 pandas 中的小计列?