切片分组的数据帧承载的行比预期的多

问题描述 投票:0回答:1

我正在尝试过滤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

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

帮助,请^ _ ^

python pandas group-by slice
1个回答
0
投票

对于给定的样本,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
© www.soinside.com 2019 - 2024. All rights reserved.