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

2024-09-30 04:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个数据帧:

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个数据帧。 前两个是每个有鸡的ID的数据帧。第二个是所有有牛肉的身份证。这很简单:

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

但是对于第三种情况,如果一个身份证一次没有鸡肉,另一次没有牛排,我想放弃任何一行。所以在这个例子中,它就是ID7000,他只点了鸡肉。但我该如何实现呢?你知道吗


Tags: 数据iddataframedf情况col例子身份证
2条回答

any一起使用filter

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

这里有一个直观的方法。其思想是创建一个序列,通过IDcol_3聚合到set。你知道吗

然后过滤映射的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

相关问题 更多 >

    热门问题