【问题标题】:Using pandas group-by to select specific sub-groups使用 pandas group-by 选择特定的子组
【发布时间】:2016-11-17 12:41:15
【问题描述】:

我有一个如下形式的 pandas 数据框:

id grp values1 values2 0 1 a_1 2 4 1 1 a_2 3 6 2 1 b_1 4 8 3 2 b_2 5 10 4 2 c_1 6 12 5 3 z_1 7 14 6 4 y_1 8 16 7 5 a_1 9 18 8 5 a_2 10 20 9 5 a_1 11 22 10 5 a_2 12 24 11 7 z_1 13 26 12 8 q_1 14 28 13 9 a_2 15 30 14 9 a_1 16 32

我想要的是一个简化的数据框,其中包含“a_1”和“a_2”的行和 id 仅用于 ID 组,如下所示。

id grp values1 values2 7 5 a_1 9 18 8 5 a_2 10 20 9 5 a_1 11 22 10 5 a_2 12 24 13 9 a_2 15 30 14 9 a_1 16 32

在对 id 变量进行计数时,结束数据帧应该有偶数,因为组值成“对”,即“a_1”和“a_2”在一起。此外,这应该适用于任意数量的“按列分组”,例如 id 列。

数据框的代码贴在下面:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,4,5,5,5,5,7,8,9,9]
                   ,'grp' : ['a_1', 'a_2', 'b_1', 'b_2', 'c_1', 'z_1', 'y_1', 'a_1', 'a_2', 'a_1', 'a_2', 'z_1', 'q_1', 'a_2','a_1']
                   ,'values1' : [i for i in range(2,17,1)]
                   ,'values2' : [i for i in range(4,33,2)]
                  })

感谢您的考虑、时间和投入!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    或者你可以采取更简单的方法:

     filtered_df  = df.ix[(df['grp'] == 'a_1') | (df['grp'] == 'a_2')]
    

    【讨论】:

    • 没错,我知道 ix 方法,但没有以这种直截了当的方式想到它。假设我还想包含 id group 1,它有 1 个 grp。值与其他值不同,同时不采用包含额外值的任何其他 grp,即“b_1”。
    • 另外,除此之外,数字需要是偶数,因为在我的数据中有时我有三行,即“a_1”、“a_1”和“a_2”,并且该 id 应该不包含在缩减数据框中!
    • 我不明白你的意思,如果你想添加另一个条件,请按照上面的模板添加另一个 |你会吃饭的。对于第二个问题,如果您正在谈论重置索引,请尝试 df.reset_index(drop=True,inplace=True)
    【解决方案2】:

    您可以简单地在数据框中搜索条件:

    reduced_df  = df[(df['grp'] == 'a_1') | (df['grp'] == 'a_2')]
    

    【讨论】:

      【解决方案3】:

      我设法做到了这样的“偶数”解决方案,也许不是最有效的,但它完成了工作:

      # One row per id
      pivot = df[['id', 'grp', 'values1']].pivot_table('values1', index = 'id', columns = 'grp', aggfunc = (lambda i: i.size)).reset_index()
      
      # Take out the id rows which fulfills condition of being even numbers
      pivot2 = pivot[pivot[['a_1', 'a_2']].sum(axis = 1) %2 == 0].reset_index()
      
      # Sub-select rows from original table
      df[df['id'].isin(pivot2['id'])]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多