在pandas中使用groupby和transform时保留“key”列

14

找到一个标准化的数据框,移除用于分组的列,因此它不能在后续的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),但是当使用transform时,该列会消失,留下原始索引和一个没有关键字的新数据集。

编辑:下面是我想要做到的一行代码:

    df.groupby('a').transform(lambda x: x+1).groupby('a').mean()
    KeyError 'a'
在这个例子中,pandas文档中使用一个函数来基于索引进行分割,这似乎完全避免了这个问题。或者,总是可以在groupby/transform之后添加列,但肯定有更好的方法吧?
更新: 看起来reset_index/as_index仅适用于将每个组缩减为单行的函数。 从答案中似乎有一些选项。

4
你的最终目标不是很清楚... 如果现场添加一个新的__virtual__列会解决你的问题吗:df.assign(new=df.groupby('a').transform('sum')) - MaxU - stand with Ukraine
整体问题是我需要多次按列'a'进行分组,因此任何允许这样做的解决方案都可以。 - user2699
@MaxU,这看起来是一个可能的方法,尽管在这种情况下我正在将变换应用于多个列。 - user2699
你能否发布更详细的问题/示例?现在你的问题看起来像是一个XY问题 - MaxU - stand with Ukraine
这只是一点点。Pandas文档提供了几种方法来保持索引(reset_index, as_index=False),这让我想到这将是重复使用索引的正确方法。但实际上,在后续的groupby中重复使用原始索引更容易,因为即使保留索引列,transform函数也会修改索引列。 - user2699
df.groupby('a').apply(lambda x: (x.b+1).mean()) - MaxU - stand with Ukraine
4个回答

13

这个问题也在这里讨论。

返回的对象与原始df具有相同的索引,因此您可以执行以下操作

pd.concat([
    df['a'],
    df.groupby('a').transform(lambda x: x)
], axis=1)

2

这很奇怪!

我像这样欺骗它

df.groupby(df.a.values).transform(lambda x: x)

enter image description here


1
不幸的是,这并不容易... 试试这个:df.groupby(df.a.values).transform('sum') - MaxU - stand with Ukraine
我喜欢这个。它取决于转换来保持实际值(因此内置函数如平均值会改变它),但仍然可以用于在后续的groupby中创建相同的组。 - user2699

2
另一种实现与Pepacz建议类似的方法:

最初的回答

df.loc[:, df.columns.drop('a')] = df.groupby('a').transform(lambda x: x)

0

试试这个:

df['b'] = df.groupby('a').transform(lambda x: x)
df.drop_duplicates()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接