Python 根据数据框中列的True或False从数据框中选择行

Python 根据数据框中列的True或False从数据框中选择行,python,pandas,Python,Pandas,根据数据框中列的True或False从数据框中选择行: 比如说, import pandas as pd df = {'uid':["1", "1", "1", "1", "2", "2", "2", "2"], 'type': ["a", "a", "b", "a", "a", "b", "b", "a"], 'is_topup':["FALSE", "FALSE", "TRUE", "FALSE","FALSE", "TRUE", "TRUE", "FAL

根据数据框中列的True或False从数据框中选择行:

比如说,

import pandas as pd
df = {'uid':["1", "1", "1", "1", "2", "2", "2", "2"], 
        'type': ["a", "a", "b", "a", "a", "b", "b", "a"], 
        'is_topup':["FALSE", "FALSE", "TRUE", "FALSE","FALSE", "TRUE", "TRUE", "FALSE"],
       'label':["FALSE", "FALSE", "TRUE", "FALSE","FALSE", "TRUE", "TRUE", "FALSE"]}
df = pd.DataFrame(df)  



   uid type  is_topup  label
0   1    a    FALSE  FALSE
1   1    a    FALSE  FALSE
2   1    b     TRUE   TRUE
3   1    a    FALSE  FALSE
4   2    a    FALSE  FALSE
5   2    b     TRUE   TRUE
6   2    b     TRUE   TRUE
7   3    a    FALSE  FALSE
8   3    b     TRUE   TRUE
9   3    b     TRUE   TRUE
10  3    a    FALSE  FALSE

我想在如下条件下选择一行

  uid type   is_topup  label
0   1    a    FALSE  FALSE
1   1    a    FALSE  FALSE
2   1    b     TRUE   TRUE
4   2    a    FALSE  FALSE
5   2    b     TRUE   TRUE
7   3    a    FALSE  FALSE
8   3    b     TRUE   TRUE

我试图查看pandas文档,但没有找到答案。

在我看来,一个简单的

result = df.drop_duplicates()

我们应该做到这一点。至少您给出的示例可以这样工作。

不确定最有效的方法,但使用
idxmax

new_df = df.groupby('uid').apply(lambda x: x[:(x['is_topup'] & x['label']).reset_index(drop=True).idxmax()+1])
print(new_df)
输出:

       uid type  is_topup  label
uid                             
1   0    1    a     False  False
    1    1    a     False  False
    2    1    b      True   True
2   4    2    a     False  False
    5    2    b      True   True
3   7    3    a     False  False
    8    3    b      True   True

你说的“停下来”是什么意思?你能解释一下你想放下哪一行吗。在没有说明要删除哪些行的情况下,删除它们似乎是没有逻辑依据的。为什么我必须删除第3、6、9和10行?似乎不需要删除重复项(0和1是重复项)。不是这样,我需要所有uid和一些行。示例uid=3 new,有4行,我想要2行(7,8)是补码,标签更改为TRUE TRUEyes,但“str和bool不支持的操作数类型”是
是补码
标签
str
s?在这种情况下,将
(x['is_-toup']&x['label'])
替换为
(x['is_-toup'].eq('TRUE')&x['label'].eq('TRUE'))