【发布时间】:2017-03-01 13:17:26
【问题描述】:
找到一个规范化的数据框会删除用于分组依据的列,因此它不能在后续的 groupby 操作中使用。例如(编辑:更新):
df = pd.DataFrame({'a':[1, 1 , 2, 3, 2, 3], 'b':[0, 1, 2, 3, 4, 5]})
a b
0 1 0
1 1 1
2 2 2
3 3 3
4 2 4
5 3 5
df.groupby('a').transform(lambda x: x)
b
0 0
1 1
2 2
3 3
4 4
5 5
现在,对于组的大多数操作,“缺失”列成为一个新索引(然后可以使用reset_index 调整,或设置as_index=False),但是当使用转换时它会消失,留下原始索引和没有密钥的新数据集。
编辑:这是我希望能够做的一个衬里
df.groupby('a').transform(lambda x: x+1).groupby('a').mean()
KeyError 'a'
在pandas docs 的示例中,一个函数用于根据索引进行拆分,这似乎完全避免了这个问题。或者,总是可以在 groupby/transform 之后添加列,但肯定有更好的方法吗?
更新: 看起来 reset_index/as_index 仅适用于将每个组减少为单行的函数。从答案中似乎有几个选择
【问题讨论】:
-
您的最终目标不是很明确...动态添加一个新的 virtual 列会解决您的问题吗:
df.assign(new=df.groupby('a').transform('sum'))? -
总体问题是我需要对列“a”进行多次分组,所以任何允许这样做的解决方案。
-
@MaxU,这看起来是一种可能的方法,尽管在这种情况下,我将转换应用于多个列。
-
你能发布更详细的问题/例子吗?现在你的问题在我看来像XY problem
-
就是这样。 pandas 文档提出了几种保留索引的方法(reset_index,as_index=False),这让我认为这将是重用索引的正确方法。确实,在后续 groupby 中重用原始索引更容易,因为即使保留索引列,transform 函数也会修改索引列。