【问题标题】:Python pandas filter data by groupby second level valuesPython pandas 按 groupby 二级值过滤数据
【发布时间】:2021-08-26 18:27:20
【问题描述】:

我有一个包含两个组(时间和区域)的 groupby 对象。我需要按时间绘制每个区域的值。在绘图之前,我想我会为每个区域创建一个数据框,但我无法提取特定区域的所有时间 - 例如过滤掉除值为 2 的区域之外的所有区域。我会想到类似“ group_df.region == 2"。

一般来说,我在处理多索引/groupby 对象时遇到了很多麻烦 - 任何方向都将不胜感激。

一个例子:

import random
times = range(0,11)
regions = range(1,6)
vals = []
for t in times:
    for r in regions:
        vals.append( [t,r,random.randint(1,100)] )
    

df_gp = df.groupby(['time','region'])

df_gp.mean().head(10)


             value
time region       
0    1          53
     2          98
     3          41
     4           4
     5          62
1    1          34
     2          40
     3          35
     4          49
     5          36

我想获得所有区域 2 数据的平均值,考虑如下:

df_gp[[df_gp.region==2]]

相反,我遍历时间并使用 get_group 将值附加到一个新数组,然后我从中创建一个新数据帧。对我来说似乎有点困难。

gs = []
for t in times:
    gs.append(df_gp.get_group((t,2)).mean()) #I need mean value for each region at that time
    
print(gs)

只包含时间和值的数组:

tv = [ (g.time, g.val) for g in gs]

为区域 2 制作一个新的数据框:

df2 = pd.DataFrame(tv,columns=['time','vals'])

剧情:

df2.plot(x='time',y='vals')

除了上面的解决方法之外,我还可以在创建 groupby 之前按区域过滤掉数据框。我喜欢 groupby('time','region') 的想法,但似乎无法像我期望的那样与该对象交互。谢谢。

df[df.region==2].groupby('time').mean()

这里的任何方向都会有所帮助。谢谢!

【问题讨论】:

  • Groupby 并不完全允许您这样做。替代解决方案df[df.region==2].groupby('time').mean() 工作得非常好 - 它对你没有什么作用?
  • df.mean(level=1)?
  • 按时间和地区对数据进行分组然后根据需要使用它似乎是合乎逻辑的(至少对我而言)。我猜 groupby 只是限制了它通过更深层次的组选择数据的能力。

标签: python pandas group-by


【解决方案1】:

看起来解决方案是在分组之前过滤数据:

df[df.region==2].groupby('time').mean()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2022-11-18
    • 2021-03-05
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多