Comment filtrer la trame de données ci-dessous pour supprimer toutes les lignes d'ID en double après un certain nombre d'occurrences d'ID. C'EST À DIRE. supprimer toutes les lignes de ID == 0 après la troisième occurrence de ID == 0

Merci

 pd.DataFrame(np.random.randint(0,10,size=(100, 2)), columns=['ID', 'Value']).sort_values('ID')
               
                 Output:
                   ID   Value
                    0   7
                    0   8
                    0   5
                    0   5
                ... ... ...
                    9   7
                    9   7
                    9   1
                    9   3

Desired Output for filter_count = 3:

                 Output:
                   ID   Value
                    0   7
                    0   8
                    0   5
                    1   7
                    1   7
                    1   1
                    2   3


                
0
Bo Peng 29 août 2020 à 21:46

3 réponses

Meilleure réponse

Si vous souhaitez faire cela pour tous les ID, utilisez:

df.groupby("ID").head(3)

Pour un identifiant unique, vous pouvez attribuer une nouvelle colonne à l'aide de cumcount, puis filtrer par conditions:

df["count"] = df.groupby("ID")["Value"].cumcount()

print (df.loc[(df["ID"].ne(0))|((df["ID"].eq(0)&(df["count"]<3)))])

    ID  Value  count
64   0      6      0
77   0      6      1
83   0      0      2
44   1      7      0
58   1      5      1
40   1      2      2
35   1      7      3
89   1      9      4
19   1      7      5
10   1      3      6
45   2      4      0
68   2      1      1
74   2      4      2
75   2      8      3
34   2      4      4
60   2      6      5
78   2      0      6
31   2      8      7
97   2      9      8
2    2      6      9
93   2      8     10
13   2      2     11
...
2
Henry Yik 29 août 2020 à 19:01

Merci Henry,

J'ai modifié votre code et je pense que cela devrait également fonctionner.

Votre df.groupby("ID").head(3) est génial. Merci.

df["count"] = df.groupby("ID")["Value"].cumcount()
df.loc[df["count"]<3].drop(['count'], axis=1)
0
Bo Peng 29 août 2020 à 19:00

Je ferai sans groupby

df = pd.concat([df.loc[df.ID==0].head(3),df.loc[df.ID!=0]])
2
BENY 29 août 2020 à 19:04