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”)分组吗?
答案 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