Mon DF actuel ressemble à ceci

Combinations               Count
1   ('IDLY', 'VADA')       3734
6   ('DOSA', 'IDLY')        2020
9   ('CHAPPATHI', 'DOSA')   1297
10  ('IDLY', 'POORI')       1297
11  ('COFFEE', 'TEA')       1179
13  ('DOSA', 'VADA')        1141
15  ('CHAPPATHI', 'IDLY')   1070
16  ('COFFEE', 'SAMOSA')    1061
17  ('COFFEE', 'IDLY')      1016
18  ('POORI', 'VADA')       1008

Disons que je filtre par le mot-clé 'DOSA' de la trame de données ci-dessus, j'obtiens l'OP ci-dessous

    Combinations           Count
6   ('DOSA', 'IDLY')        2020
9   ('CHAPPATHI', 'DOSA')   1297
13  ('DOSA', 'VADA')        1141

Mais je voudrais que la sortie soit comme le df ci-dessous (qui a ignoré le mot clé de filtre comme étant commun,

    Combinations    Count
6   IDLY            2020
9   CHAPPATHI       1297
13  VADA            1141

Quel concept de pandas faut-il utiliser ici? Comment cela peut il etre accompli?

4
Ragesh Kr 1 juin 2020 à 20:01

3 réponses

Meilleure réponse

En général, ce n'est pas idéal d'avoir list, tuples, sets, etc dans une dataframe. Il est préférable d'avoir plusieurs enregistrements pour chaque instance en cas de besoin.

Vous pouvez utiliser explode turn Combinations dans ce formulaire et filtrer dessus

keyword = 'DOSA'

s = df.explode('Combinations')

s.loc[s.Combinations.eq('keyword').groupby(level=0).transform('any') & s.Combinations.ne('keyword')]

Ou enchaînez les deux commandes avec .loc[lambda ]:

(df.explode('Combinations')
   .loc[lambda x: x.Combinations.ne(keyword) & 
            x.Combinations.eq(keyword).groupby(level=0).transform('any')]
)

Production:

   Combinations  Count
6          IDLY   2020
9     CHAPPATHI   1297
13         VADA   1141
1
Quang Hoang 1 juin 2020 à 17:19
d = df[df['Combinations'].transform(lambda x: 'DOSA' in x)].copy()
d['Combinations'] = d['Combinations'].apply(lambda x: set(x).difference(['DOSA']).pop())
print(d)

Tirages:

   ID Combinations  Count
1   6         IDLY   2020
2   9    CHAPPATHI   1297
5  13         VADA   1141
0
Andrej Kesely 1 juin 2020 à 17:16

Ce que je ferai

x=df.explode('Combinations')
x=x.loc[x.index[x.Combinations=='DOSA']].query('Combinations !="DOSA"')
x
   Combinations  Count
6          IDLY   2020
9     CHAPPATHI   1297
13         VADA   1141
1
BEN_YO 1 juin 2020 à 17:34