【问题标题】:Python Pandas - select multi-level index based on some condition on valuesPython Pandas - 根据值的某些条件选择多级索引
【发布时间】:2020-11-15 16:32:15
【问题描述】:
Premise Description                       Victim Sex
7TH AND METRO CENTER (NOT LINE SPECIFIC)  F               21
                                          M               36
                                          X                1
ABANDONED BUILDING ABANDONED HOUSE        F               98
                                          M              158
                                                        ... 
WEBSITE                                   F               38
                                          M               30
YARD (RESIDENTIAL/BUSINESS)               F             5694
                                          M             7229
                                          X              158
Name: Victim Sex, Length: 889, dtype: int64

我使用以下代码对数据框进行分组,结果如上:

data.groupby(["Premise Description","Victim Sex"])["Victim Sex"].count()

我需要为每个前提描述找到更受害的受害者性别? 我需要输出为:

Premise Description                       Victim Sex
7TH AND METRO CENTER (NOT LINE SPECIFIC)  M               36
ABANDONED BUILDING ABANDONED HOUSE        M              158
....

【问题讨论】:

  • 能否提供数据框的文字(同上图)?
  • 另外,请澄清/指定一个问题。
  • @anon01 我已经为图像添加了文本,并通过预期的输出使问题更加清晰。

标签: python python-3.x pandas pandas-groupby multi-index


【解决方案1】:

所以你的初始数据框可能如下所示:

>>df

   desp Sex
0   a   m
1   a   m
2   b   f
3   a   f
4   b   m
5   c   f
6   b   m
7   c   f
8   c   m
9   b   f
10  a   f
11  b   m
12  c   f

我们将其分组为:

g=df.groupby(['desp','Sex'])['Sex'].count()
g

这给了我们一个分组的series

desp  Sex
a     f      2
      m      2
b     f      2
      m      3
c     f      3
      m      1
Name: Sex, dtype: int64

现在我尝试使用以下方法将此系列转换为数据框:

a=pd.DataFrame({'count' : df.groupby( [ "desp", "Sex"] ).size()}).reset_index()

这给出了:

 desp Sex count
0   a   f   2
1   a   m   2
2   b   f   2
3   b   m   3
4   c   f   3
5   c   m   1

现在我通过以下方式创建了一个布尔掩码:

mask= a.groupby(['desp'])['count'].transform(max)== a['count']

这个面具将为您提供所需的结果:

>>a[mask]

  desp Sex count
0   a   f   2
1   a   m   2
3   b   m   3
4   c   f   3

【讨论】:

    【解决方案2】:

    试试:

    data.groupby(["Premise Description","Victim Sex"])["Victim Sex"].count().sort_values().groupby(level=0).tail(1)
    

    样本df:

        desp    Sex
    0   a   m
    1   a   m
    2   b   f
    3   a   f
    4   b   m
    5   c   f
    6   b   m
    7   c   f
    8   c   m
    9   b   f
    10  a   f
    11  b   m
    12  c   f
    

    u = df.groupby(["desp", "Sex"])["Sex"].count()
    v = u.sort_values().groupby(level=0).tail(1)
    

    你:

    desp  Sex
    a     f      2
          m      2
    b     f      2
          m      3
    c     f      3
          m      1
    Name: Sex, dtype: int64
    

    v:

    desp  Sex
    a     m      2
    b     m      3
    c     f      3
    Name: Sex, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2020-10-01
      • 2016-11-02
      • 2016-10-17
      • 2021-11-17
      • 2022-08-05
      • 1970-01-01
      相关资源
      最近更新 更多