Отбросить строки в pandas на основе того же ключа - PullRequest
3 голосов
/ 29 мая 2020

Как я могу удалить строки, в которых столбец A является ключом, а любые строки для этого ключа содержат как «foo», так и «moo» в столбце C

df_before:

"cat"   |"waverly way"|"foo"|10.0
"cat"   |"smokey st"  |"moo"|9.7
"rabbit"|"rapid ave"  |"foo"|6.6
"rabbit"|"far blvd"   |"too"|3.2

df_after:

"rabbit"|"rapid ave"  |"foo"|6.6
"rabbit"|"far blvd"   |"too"|3.2

Ответы [ 3 ]

4 голосов
/ 29 мая 2020

Вы можете сделать это так:

df.columns = ['A', 'B', 'C', 'D']

df:

        A            B    C     D
0     cat  waverly way  foo  10.0
1     cat    smokey st  moo   9.7
2  rabbit    rapid ave  foo   6.6
3  rabbit     far blvd  too   3.2

.

filter = ['foo,moo']
# used transform to concat all the values in column 'C' for a given 'A'
df['C'] = df[['A', 'B', 'C', 'D']].groupby(by=['A'])['C'].transform(lambda x: ','.join(x))

Modified df:

        A            B        C     D
0     cat  waverly way  foo,moo  10.0
1     cat    smokey st  foo,moo   9.7
2  rabbit    rapid ave  foo,too   6.6
3  rabbit     far blvd  foo,too   3.2

.

# applied negative mask to filter values with foo,moo in 'C'
df1 = df.loc[~df['C'].isin(filter)].reset_index(drop=True)

print(df1)

Вывод:

        A          B        C    D
0  rabbit  rapid ave  foo,too  6.6
1  rabbit   far blvd  foo,too  3.2
0 голосов
/ 29 мая 2020

Вот еще один способ:

x = df.groupby(by=['A'])['C'].agg(' '.join).str.contains((r'(?=.*foo)(?=.*moo)')).reset_index()
index = list(x[x['C']==True]['A'])
print(df[~df['A'].isin(index)])

        A            B    C    D
2  rabbit  rapid ave    foo  6.6
3  rabbit  far blvd     too  3.2
0 голосов
/ 29 мая 2020

Я назвал каждый столбец A, B и C. Я назвал ваш df df_before.

Надеюсь, это поможет (если он не работает полностью :-P)

import pandas as pd
foomooList=['foo','moo']

df=df_before.copy()

dfA_unique_values= df.a.unique()
dfA_keepValues=[]

for x in dfA_unique_values:
    tempdf=df.copy()
    checkerDF=tempdf[tempdf.a==x]
    checkerDfC_unique_values = checkerDF.c.unique()

    if all(y in checkerDfC_unique_values for y in foomooList):
        pass #do nothing since both foo and moo are in the subset

    else:
        dfA_keepValues.append(x) #put A value in keep list

df_after=df_before[df_before.A.isin(dfA_keepValues)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...