在pandas中基于一个列的True或False选择DataFrame中的行

3
在pandas中,根据列中的True或False选择DataFrame中的行:
例如,
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

我想在类似于“is”的条件下选择一行。
  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文档,但没有找到答案。


你的“and stop in”是什么意思? - MLAlex
你能解释一下你想要删除哪些行吗?如果不解释你想要删除哪些行,似乎没有逻辑理由删除它们。为什么我要删除第3、6、9和10行?它们看起来不像是要删除重复项(0和1是重复项)。 - Adirio
2个回答

1

不确定最有效的方法,但使用 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

是的,但是“&:'str'和'bool'的操作数类型不受支持”。 - artpii
1
is_topuplabel是字符串吗?如果是这种情况,将(x['is_topup']&x['label'])替换为(x['is_topup'].eq('TRUE')&x['label'].eq('TRUE')) - Chris

0

在我看來,一個簡單的

result = df.drop_duplicates()

应该可以解决问题。至少您提供的示例会这样工作。


不是那样,我想要所有UID和某些行。例如uid = 3 new,有4行,我想要2行(7,8)是充值,标签更改为TRUE真。 - artpii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接