【问题标题】:Group by category in pandas DataFrame object output to dictionary object在 pandas DataFrame 对象输出到字典对象中按类别分组
【发布时间】:2015-04-12 17:25:31
【问题描述】:

我有一个类似于以下内容的 pandas DataFrame 对象:

    In [106]: df
    Out [106]: df[
                     Amount       Category         
          date
    2014-08-05        18.40        Thing01  
    2014-08-05       192.60        Thing01
    2014-08-05        10.42        Thing02
    2014-08-05        13.34        Thing07
    2014-08-05       364.56        Thing04
    2014-08-05       843.21        Thing03
    2014-08-04        14.65        Thing04
    2014-08-04        56.98        Thing11
    2014-08-04        76.21        Thing99
    2014-08-04       786.22        Thing99
    2014-08-04        87.44        Thing99
    2014-08-04        53.23        Thing01
    2014-08-04        32.12        Thing99
    ]

我想按“类别”对这些数据进行分组,并使用结果创建一个 Python 字典,如下所示:

In [107]: OutInfo
Out [107]: OutInfo = {

     Thing01:
                           Amount
                date             
          2014-08-05        18.40
          2014-08-05       192.60
          2014-08-04        53.23

     Thing02:
                           Amount
                date    
          2014-08-05        10.42

     Thing07:
                           Amount
                date
          2014-08-05        13.34

     Thing04:
                           Amount
                date
          2014-08-05       364.56
          2014-08-04        14.65

     Thing03:
                           Amount
                date
          2014-08-05       843.21

     Thing11:
                           Amount
                date
          2014-08-04        56.98

     Thing99:
                           Amount
                date
          2014-08-04        76.21
          2014-08-04       786.22
          2014-08-04        87.44
 }

我尝试过使用诸如 df.groupby("Category") 之类的命令,最后带有各种功能,包括 .apply 方法(我也不完全理解......)。我尝试了其他方法,但一天有多个条目这一事实使我无法使用这些方法。提前感谢您的帮助!

-杰里米

【问题讨论】:

  • 我试图避免使用循环。我已经有一个使用“for”循环的解决方案,但速度很慢。

标签: python-3.x pandas group-by


【解决方案1】:

groupby 是正确的想法。为了得到你想要的,你可以做类似的事情

>>> d = {k: v.drop("Category", axis=1) for k,v in list(df.groupby("Category"))}
>>> pprint.pprint(d)
{'Thing01':             Amount
date              
2014-08-05   18.40
2014-08-05  192.60
2014-08-04   53.23,
[...]
 'Thing99':             Amount
date              
2014-08-04   76.21
2014-08-04  786.22
2014-08-04   87.44
2014-08-04   32.12}

如果您在 groupby 对象上调用 list,您将获得一组键/值元组的列表。如果你打电话给dict(list(grouped)),它就会变成一个字典。但是,通常情况下,您不会像示例所需的输出那样删除键列。因此,如果您愿意保留额外的列,那就更容易了:

>>> d = dict(list(df.groupby("Category")))
>>> d["Thing01"]
            Amount Category
date                       
2014-08-05   18.40  Thing01
2014-08-05  192.60  Thing01
2014-08-04   53.23  Thing01

【讨论】:

  • 无需转换为列表。只需遍历 groupby 对象d = {k: v.drop("Category", axis=1) for k,v in df.groupby("Category")}
  • 我采用了 dict(list(df.groupby("Category"))) 方法。它比我一直使用的“for”循环减少了整整一秒。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2020-12-07
  • 2021-07-28
  • 2019-07-15
  • 2020-12-12
相关资源
最近更新 更多