如果列中的值不符合另一列中的要求,则删除行

时间:2018-05-19 20:35:32

标签: python pandas

所以我想说我有这个数据帧:

df = DataFrame({'ID': [1001,4003,1001, 4003, 7000, 7000], 
            'col_2': ['3', '8', '2', '1','7','9'], 
            'col_3': ['Steak','Chicken','Chicken','Steak','Chicken','Chicken']})

我想创建3个数据框。 前两个是每个拥有Chicken的ID的数据框。第二个是所有带牛肉的ID。这很容易:

dfsteak = df[~(df['col_3'] != 'Steak')]
dfchicken =  df[~(df['col_3'] != 'Chicken')]

但是对于第三个,如果一个ID没有鸡一次,我想放弃任何一行,而牛排另一个。因此在这个示例DF中,ID为7000,只订购了鸡。但是我该如何实现呢?

2 个答案:

答案 0 :(得分:2)

这是一种直观的方式。我们的目的是创建一个按col_3汇总setID的系列。

然后过滤当映射的set {'Steak', 'Chicken'}的超集时。

s = df.groupby('ID')['col_3'].apply(set)
df = df[~(df['ID'].map(s) >= {'Steak', 'Chicken'})]

print(df)

     ID col_2    col_3
4  7000     7  Chicken
5  7000     9  Chicken

答案 1 :(得分:1)

filterany

一起使用
df.groupby('ID').filter(lambda x : ((x['col_3']=='Steak').any())&((x['col_3']=='Chicken').any()))
Out[14]: 
     ID col_2    col_3
0  1001     3    Steak
1  4003     8  Chicken
2  1001     2  Chicken
3  4003     1    Steak

过滤掉ID 7000

df.groupby('ID').filter(lambda x : ~((x['col_3']=='Steak').any())&((x['col_3']=='Chicken').any()))
Out[16]: 
     ID col_2    col_3
4  7000     7  Chicken
5  7000     9  Chicken