2 votes

Ajout de nouvelles lignes avec une valeur par défaut basée sur les valeurs du dataframe dans le dataframe

J'ai des données avec un grand nombre de colonnes :

df:
ID   col1   col2   col3 ... col100
1    a      x      0        1  
1    a      x      1        1
2    a      y      1        1
4    a      z      1        0  
...
98   a      z      1        1
100  a      x      1        0

Je veux combler les lacunes ID avec une valeur par défaut qui indique que les données sont manquantes ici. Par exemple, ici, ce serait ID 3 et hypothétiquement, disons que les données de la ligne manquante ressemblent à ceci ID 100

ID   col1   col2  col3 ... col100
3    a      x     1        0
99   a      x     1        0

Sortie attendue :

df:
ID   col1   col2   col3 ... col100
1    a      x      0        1  
1    a      x      1        1
2    a      y      1        1
3    a      x      1        0
4    a      z      1        0  
...
98   a      z      1        1
99   a      x     1        0
100  a      x      1        0

Je suis également d'accord pour que les 3 et 99 soient en bas.

J'ai essayé plusieurs façons d'ajouter de nouvelles lignes :

noresponse = df[filterfornoresponse].head(1).copy() #assume that this will net us row 100

for i in range (1, maxID):
    if len(df[df['ID'] == i) == 0: #IDs with no rows ie missing data
        temp = noresponse.copy()
        temp['ID'] = i
        df.append(temp, ignore_index = True)

Cette méthode ne semble pas ajouter quoi que ce soit.

J'ai également essayé

pd.concat([df, temp], ignore_index = True)

au lieu de df.append

J'ai également essayé d'ajouter les lignes à une liste. noresponserows avec l'intention de concilier la liste avec df :

noresponserows = []

for i in range (1, maxID):
    if len(df[df['ID'] == i) == 0: #IDs with no rows ie missing data
        temp = noresponse.copy()
        temp['ID'] = i
        noresponserows.append(temp)

Mais ici, la liste ne contient toujours qu'une seule ligne, alors que je sais qu'il y a plusieurs lignes à ajouter dans mes données.

Je ne sais pas pourquoi j'ai du mal à ajouter plus d'une instance de noresponse dans la liste, et pourquoi je ne peux pas ajouter directement à un cadre de données. J'ai l'impression que quelque chose m'échappe ici.

Je pense que ça peut avoir un rapport avec le fait que j'ai pris une copie d'une rangée dans le df par rapport à la construction d'un nouveau bâtiment. La raison pour laquelle je prends une copie d'une rangée pour obtenir noresponse c'est parce qu'il y a un grand nombre de colonnes, il est donc plus facile de prendre une ligne existante.

1voto

user17242583 Points 1102

Disons que vous avez un cadre de données comme celui-ci :

>>> df
  col1 col2  col100  ID
0    a    x       0   1
1    a    y       3   2
2    a    z       1   4

Tout d'abord, définissez le ID pour être l'index :

>>> df = df.set_index('ID')
>>> df
   col1 col2  col100
ID                  
1     a    x       0
2     a    y       3
4     a    z       1

Vous pouvez maintenant utiliser df.loc pour ajouter facilement des rangées.

Sélectionnons la dernière ligne comme ligne par défaut :

>>> default_row = df.iloc[-1]
>>> default_row
col1      a
col2      z
col100    1
Name: 4, dtype: object

Nous pouvons l'ajouter directement dans le cadre de données à l'ID 3 :

>>> df.loc[3] = default_row
>>> df
   col1 col2  col100
ID                  
1     a    x       0
2     a    y       3
4     a    z       1
3     a    z       1

Ensuite, utilisez sort_index pour trier les lignes lexicographiquement par index :

>>> df = df.sort_index()
>>> df
   col1 col2  col100
ID                  
1     a    x       0
2     a    y       3
3     a    z       1
4     a    z       1

Et, éventuellement, réinitialiser l'index :

>>> df = df.reset_index()
>>> df
   ID col1 col2  col100
0   1    a    x       0
1   2    a    y       3
2   3    a    z       1
3   4    a    z       1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X