Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据条件删除行组_Python_Pandas - Fatal编程技术网

Python 根据条件删除行组

Python 根据条件删除行组,python,pandas,Python,Pandas,我有以下数据帧: df = A B C 111-ABC 123 EEE 111-ABC 222 EEE 111-ABC 444 XXX 222-CCC 222 YYY 222-CCC 333 67T 333-DDD 123 TTT 333-DDD 123 BTB 333-DDD 444 XXX 333-DDD 555 AAA 我想删除列B中不包含123的所

我有以下数据帧:

df =

A          B       C
111-ABC    123    EEE
111-ABC    222    EEE
111-ABC    444    XXX
222-CCC    222    YYY
222-CCC    333    67T
333-DDD    123    TTT
333-DDD    123    BTB
333-DDD    444    XXX
333-DDD    555    AAA
我想删除列
B
中不包含
123
的所有行组(按
A
分组)

预期结果如下(删除了行组
222-CCC
):

怎么做?我假设首先我应该使用
groupby
,但是如何过滤出行组,而不仅仅是特定的行

result = df.groupby("A").... ??
您可以使用
groupby().filter()
语法:

df.groupby('A').filter(lambda g: (g.B == 123).any())

使用
查询

a = df.query('B == 123').A.unique()
df.query('A in @a')

         A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX
5  333-DDD  123  TTT
6  333-DDD  123  BTB
7  333-DDD  444  XXX
8  333-DDD  555  AAA
b = df.query('B == 123 & C == "EEE"').A.unique()
df.query('A in @b')

          A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX

您可以在第一个
查询

a = df.query('B == 123').A.unique()
df.query('A in @a')

         A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX
5  333-DDD  123  TTT
6  333-DDD  123  BTB
7  333-DDD  444  XXX
8  333-DDD  555  AAA
b = df.query('B == 123 & C == "EEE"').A.unique()
df.query('A in @b')

          A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX

如果速度很重要。试试这个

cond1 = df.B.values == 123
a = np.unique(df.A.values[cond1])
df.loc[df.A.isin(a)]

谢谢如何添加各种条件,例如按B列和C列添加?是否应该是
((g.B==123)|(g.C==222)).any()
?根据您的需要,这对我来说似乎是正确的。此外,
df.groupby('A').filter(x.B.values中的lambda x:123)
我如何添加各种条件,例如,通过使用逻辑OR和来添加列B和C?好的,我已经解决了。此解决方案比@Psydom提出的解决方案快得多。不知道确切的原因,但在我的1GB数据集上,它的工作速度要快得多。