【问题标题】:Get values from pandas.core.groupby.generic.DataFrameGroupBy object从 pandas.core.groupby.generic.DataFrameGroupBy 对象获取值
【发布时间】:2021-03-15 23:53:41
【问题描述】:

嗨,所以我有这样的数据框,它在 time 列中有 71 个唯一值,lat 列中有 721 个唯一值,lon 列中有 1440 个唯一值,并且 temp 列中的所有值都是唯一的。

数据框示例:

  time        latitude  longitude       temp
1950-01-01      90.0     0.00         49654.792969
1950-01-01      90.0     0.25         49654.792969
   .              .       .                .
   .              .       .                .
73715040 rows * 4 cloumn

现在我想使用 latlon 列进行分组,以获取所有时间段内所有具有 1038240 rows(721 lat*1440 lon) 的网格或对的所有 temp 值,所以我正在这样做。

df = df.groupby(['latitude', 'longitude'])

现在是pandas.core.groupby.generic.DataFrameGroupBy object,我无法从中访问值。所以我试图通过df.apply(pd.DataFrame) 将其转换为数据帧,但这需要很多时间,而且我的内核正在崩溃。那么有没有其他方法可以获取记录,或者我在这里做错了什么。如果可能,请建议其他方式。

【问题讨论】:

  • Pandas groupby() 指令必须带有 aggregate() 指令。你想要什么作为输出的第三列?临时逗号分隔?
  • @HenriChab 是的,我想要那个 lat lon 对的所有 temp 值

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

对象类型pandas.core.groupby.generic.DataFrameGroupBy 是一个元组列表,其中第一个元素是groupby 元素,第二个元素是该组的数据框。

请看下面的例子:

创建测试数据框

import pandas as pd

df = pd.DataFrame({"ColA": [1,1,1,2,2,3,3,3], "ColB": [5,5,6,7,7,8,8,9], "ColC": [1,2,3,4,5,6,7,8]})

测试数据帧

>>> df
   ColA  ColB  ColC
0     1     5     1
1     1     5     2
2     1     6     3
3     2     7     4
4     2     7     5
5     3     8     6
6     3     8     7
7     3     9     8

分组数据帧

>>> groups = df.groupby(["ColA", "ColB"])

>>> type(groups)
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

显示结果

>>> for group in groups:
...     g, value = group
...     print(f"Key = {g}")
...     print(value)
...     print(80*"-")
...
Key = (1, 5)
   ColA  ColB  ColC
0     1     5     1
1     1     5     2
--------------------------------------------------------------------------------
Key = (1, 6)
   ColA  ColB  ColC
2     1     6     3
--------------------------------------------------------------------------------
Key = (2, 7)
   ColA  ColB  ColC
3     2     7     4
4     2     7     5
--------------------------------------------------------------------------------
Key = (3, 8)
   ColA  ColB  ColC
5     3     8     6
6     3     8     7
--------------------------------------------------------------------------------

重要

正如@HenriChab 所评论的那样,使用aggregate 或例如sum 将返回数据帧类型而不是组类型

>>> new_df = df.groupby(["ColA", "ColB"]).sum()
>>> new_df
           ColC
ColA ColB
1    5        3
     6        3
2    7        9
3    8       13
     9        8

终于可以重置索引了。

>>> new_df.reset_index(inplace=True)

>>> new_df
   ColA  ColB  ColC
0     1     5     3
1     1     6     3
2     2     7     9
3     3     8    13
4     3     9     8

【讨论】:

  • 嘿,非常感谢您的详细回答! :)
【解决方案2】:

这应该适合你:

df.groupby(['latitude', 'longitude']).aggregate(lambda x: ','.join(map(str, x)))

【讨论】:

  • 嘿,它工作得很好,但是顺序有点混乱,就像我期望第一个纬度和经度是 90.0 和 0.00,但它出现了 -90.0 和 0.00。它采用最后一个纬度,是否可以按照与原始数据帧中相同的顺序获取该对?
  • 嘿,我使用了 sort = False,它按预期工作。感谢你的回答。我接受它。 :)
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2016-01-29
相关资源
最近更新 更多