【问题标题】:Keeping 'key' column when using groupby with transform in pandas在熊猫中使用带有变换的groupby时保留“键”列
【发布时间】: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 函数也会修改索引列。

标签: python pandas


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这个问题也在here讨论。

      返回的对象与原始df具有相同的索引,因此您可以这样做

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

      【讨论】:

        【解决方案4】:

        这很奇怪!

        我是这样骗它的

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

        【讨论】:

        • 不幸的是,这并不容易......试试这个:df.groupby(df.a.values).transform('sum')
        • 我喜欢这个。保留实际值取决于转换(因此像 mean 这样的内置函数会改变它),但它仍然可以用于在后续 groupby 中创建相同的组。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多