使用pandas group-by选择特定的子组

时间:2016-07-14 14:26:42

标签: python pandas

我在下面的表格中有一个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

我的魔杖是一个缩小的数据框,其行和ID包含" a_1"和" a_2"仅适用于下面的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)]
                  })

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

3 个答案:

答案 0 :(得分:1)

或者您可以采取更简单的方式:

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

答案 1 :(得分:0)

您只需在数据框中搜索条件:

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

答案 2 :(得分:0)

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

# 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'])]