【问题标题】:Pandas - Groupby dataframe store as dataframe without aggregatingPandas - Groupby 数据帧存储为数据帧而不聚合
【发布时间】:2016-03-17 18:56:34
【问题描述】:

我是 Pandas 的新手,我在这里阅读了很多文档、帖子和答案,但我无法找到实现目标的好策略,抱歉,如果它已经回答,我找不到它。这是我所拥有的:

df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
df = pd.DataFrame(df)
df
   key  value
0   A   2
1   B   2
2   A   1
3   B   1

我知道 groupby() 会返回一个 groupby 对象,而且我知道我可以使用 groupby 对象做很多聚合的东西(计数、大小、平均值等)。但是,我不想聚合,我只想根据“键”列对我的数据框进行分组,并将其存储为如下数据框:

   key  value
0   A   2
1   A   1
2   B   2
3   B   1

完成这一步后,我最终想要的是按值对每个组进行排序,如下所示:

   key  value
0   A   1
1   A   2
2   B   1
3   B   2

非常感谢任何答案、评论或提示。谢谢!

【问题讨论】:

  • a groupby 对象只是描述如何执行分组的元数据,它不是 df,当您对 groupby 对象执行某种聚合时,它会返回系列或 df尝试存储它是没有意义的
  • 好的,我在问题中提到 groupby 是一个对象,那么有什么提示或解决方案吗?因为下面建议的那种不是我要找的。我想保持表中行的出现顺序,而 sort 严格根据字符串顺序对它们进行排序。

标签: python pandas group-by


【解决方案1】:

您可以通过使用sort_values 对数据框进行排序而不是使用groupby 来获得所需的输出。

df.sort_values(['key', 'value'], inplace=True)

编辑:

如果您真的想使用groupby 来执行键的分组,那么可以将一个简单的filter 应用于groupby 对象。

df = df.groupby('key').filter(lambda x: True)

这似乎不是取回数据帧的最佳方式,但没有立即想到其他方法。之后,您仍然需要使用 sort_values 对值列进行排序。

【讨论】:

  • 感谢您的回答,但我想使用 groupby 的原因是: 1- 我想知道是否有使用 groupby 的方法。 2- 使用排序并不是我想要的,因为它是基于字符串(字母)或数字(值)排序的,对吧?相反,我想按键分组,无论它们在字母和/或数字中的位置如何,而不是它们在表格中的出现。
  • 我已经编辑了我的答案以包含使用 groupby 的方法。
  • 感谢@root!但这似乎不起作用,执行编辑中的行后 df 没有改变,或者我遗漏了什么?
【解决方案2】:

如果您愿意在不使用链接的情况下这样做,那么这应该可以...

df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
df = pd.DataFrame(df)

groups = df.groupby(['key', 'value'])
groups = sorted(groups)
df = pd.concat([g for _, g in groups])

print(df)

为了记录,我不完全理解您为什么不对整个帧进行排序...我猜您除了排序之外还需要用于其他转换的组,因此您希望避免自己进行排序整个框架。如果您通过这样做找到了更好的性能,请告诉我:)

【讨论】:

    【解决方案3】:

    如果您想使用groupby 的原因是为了保留索引结构,那么您可以执行以下操作:

    df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
    df = pd.DataFrame(df)
    print(df) 
    
    key  value
    0   A      2
    1   B      2
    2   A      1
    3   B      1
    

    所以,首先创建索引:

    df.set_index(['key'], inplace=True)
    print(df)
    
         value
    key       
    A        2
    B        2
    A        1
    B        1
    

    然后,对索引进行排序:

    df.sort_index(inplace=True)
    print(df)
    
         value
    key       
    A        2
    A        1
    B        2
    B        1
    

    然后,对值进行排序:

    df.sort_values('value',inplace=True)
    print(df)
    
         value
    key       
    A        1
    B        1
    A        2
    B        2
    

    如果你想保留原始索引,最后这样做:

    df.reset_index(inplace=True)
    print(df)
    
      key  value
    0   A      1
    1   B      1
    2   A      2
    3   B      2
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2012-09-01
      • 2018-02-03
      • 1970-01-01
      • 2018-03-04
      • 2015-10-11
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多