如何在 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
将您的索引提升到一列。然后通过agg
和count
聚合将您的索引聚合到一个元组中。
下面是一个最小的例子。
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 之后的所有列