【问题标题】:Slicing grouped dataframes carries more rows than expected切片分组数据帧携带比预期更多的行
【发布时间】:2020-08-27 06:12:21
【问题描述】:

我正在尝试过滤已由 groupby() 生成的数据框。 分组数据框的示例如下:

all_dists          less  more
district answer            
N        yes        9.0   1.0
         no         0.0   0.0
         maybe      0.0   0.0
W        yes        0.0   0.0
         no         0.0   0.0
         maybe      1.0   6.0
S        yes        0.0   0.0
         no         0.0   0.0
         maybe      0.0   0.0
E        yes        0.0   0.0
         no         0.0  15.0
         maybe      4.5   0.0

如果我过滤“是”和“更少”,我会得到想要的结果:

grouped_df.loc[(slice(None), slice('yes')), 'less']
>>>
all_dists          less  more
district answer            
N        yes        9.0   1.0
W        yes        0.0   0.0
S        yes        0.0   0.0
E        yes        0.0   0.0

但如果我过滤“否”或“可能”,那么它将携带前一行:

grouped_df.loc[(slice(None), slice('no')), 'less']
all_dists          less  more
district answer            
N        yes        9.0   1.0
         no         0.0   0.0
W        yes        0.0   0.0
         no         0.0   0.0
S        yes        0.0   0.0
         no         0.0   0.0
E        yes        0.0   0.0
         no         0.0  15.0

我的目标是计算过滤后的数据帧中的总和,但我似乎无法弄清楚切片有什么问题。

请帮忙^_^

【问题讨论】:

  • 你试过不使用slice函数吗?
  • 另外,您的任何变量是否定义为 Categorical
  • 不,它是groupby 操作的产物。
  • 是的,但是您的任何组变量是否定义为 categorical

标签: python pandas group-by slice


【解决方案1】:

对于给定的示例,grouped_df.loc[(slice(None), slice('yes')), 'less']grouped_df.loc[(slice(None), slice('no')), 'less'] 都会给我错误:

UnsortedIndexError: 'MultiIndex slicing requires the index to be lexsorted: slicing on levels [1], lexsort depth 0'

另一方面,如果我这样做:

grouped_df = grouped_df.sort_index()

你的数据应该是groupby()的结果,然后

grouped_df.loc[(slice(None), slice('yes')), 'less']

给了我整个数据框。如果你想提取一个单一的索引级别,你可能需要这样做:

grouped_df.loc[(slice(None), 'yes'), 'less']

给出:

district  answer
E         yes       9
N         yes       0
S         yes       6
W         yes       3
Name: less, dtype: int64

同样,

grouped_df.loc[(slice(None), 'no'), 'less']

给予

district  answer
E         no        10
N         no         1
S         no         7
W         no         4
Name: less, dtype: int64

【讨论】:

  • 谢谢...我明白你的意思,但即使我对索引进行排序,它仍然不起作用。奇怪的是为什么我在任何情况下都没有收到错误。
猜你喜欢
  • 2021-04-27
  • 2018-02-12
  • 1970-01-01
  • 2019-07-08
  • 2022-11-03
  • 2020-08-30
  • 2012-02-01
  • 2016-12-05
  • 2017-09-04
相关资源
最近更新 更多