groupby和筛选熊猫

时间:2018-06-29 20:51:48

标签: python python-2.7 pandas dataframe pandas-groupby

df:

    make    country other_columns   sale
honda   tokyo   data    1
honda   hirosima    data    0
toyota  tokyo   data    1
toyota  hirosima    data    0
suzuki  tokyo   data    0
suzuki  hirosima    data    0
ferrari tokyo   data    1
ferrari hirosima    data    0
nissan  tokyo   data    1
nissan  hirosima    data    0

条件: 保持对为1,0

所需的输出

make    country other_columns   sale
honda   tokyo   data    1
honda   hirosima    data    0
toyota  tokyo   data    1
toyota  hirosima    data    0
ferrari tokyo   data    1
ferrari hirosima    data    0
nissan  tokyo   data    1
nissan  hirosima    data    0

我尝试过的(显然不起作用)

outdf = df.groupby('sale').filter(lambda x: x > 0)

我应该将两个列(“ sale”和“ make”)分组吗?

2 个答案:

答案 0 :(得分:5)

实际上,您需要groupby,但在“ make”列上,并且可以将filter与通过'sale'列创建tuple的函数一起使用:

outdf = df.groupby('make').filter(lambda x: tuple(x.sale)== (1,0))

您将获得预期的输出:

      make   country other_columns  sale
0    honda     tokyo          data     1
1    honda  hirosima          data     0
2   toyota     tokyo          data     1
3   toyota  hirosima          data     0
6  ferrari     tokyo          data     1
7  ferrari  hirosima          data     0
8   nissan     tokyo          data     1
9   nissan  hirosima          data     0

如果相同的“ make”命令不一定总是满足1到0之间的顺序,则可以先在“ sale”列上使用sort_values

答案 1 :(得分:2)

这是使用groupby + set的解决方案。这应该是可扩展的,不需要订购:

s = df.groupby('make')['sale'].apply(set)
res = df[df['make'].map(s) >= {0, 1}]

print(res)

      make   country other_columns  sale
0    honda     tokyo          data     1
1    honda  hirosima          data     0
2   toyota     tokyo          data     1
3   toyota  hirosima          data     0
6  ferrari     tokyo          data     1
7  ferrari  hirosima          data     0
8   nissan     tokyo          data     1
9   nissan  hirosima          data     0