0
votes

Remplir des colonnes de Dataframe basées sur la condition en pandas

J'ai deux dataframes, comme ci-dessous xxx pré>

et l'exigence est de remplir DF_UPUT en fonction de la valeur dans df_input p> xxx pré>

Donc, fondamentalement, la valeur de la colonne du df_input sera la valeur de la cellule dans df_output lors de correspondances et basé df_input.id == df_outuput.id p>

J'essayais comme ci-dessous P>

for i in range(1,number_of_columnswithPass):
      df_output['Pass_'+i] = function1(df_input,i)


3 commentaires

Est-il prudent de supposer que les données initiales dans df_output sont des valeurs nulles?


Oui c'est le cas . null ou nan


Mais sa colonne d'identification est remplie


3 Réponses :


1
votes

Je suppose qu'au début, vous avez df_output em> avec les noms de colonne appropriés (comme ils devraient être après le remplissage).

Pour faire votre tâche: P>

  1. importer re code> (sera utilisé dans un instant). P> li>

  2. Définissez la fonction suivante générant une ligne OUTPU, basée sur une ligne source: p>

    out = pd.Series(vals, index=ind).rename(row.name)
    return out.groupby(lambda key: key).apply(lambda lst: (', '.join(sorted(lst))))
    


9 commentaires

Il existe d'autres colonnes dans les deux dataframes, également df_input.id == df_output.id doit être assortie


J'ai corrigé ma solution pour garder l'index source. Il y a une autre colonne à omettre, veuillez spécifier lequel (comment dire des colonnes à traiter à partir de colonnes à omettre).


Les colonnes qui commencent par la passe doivent être passées sous cette logique, d'autres peuvent rester telles qu'elles sont et les autres colonnes que j'ai pris soin de toute façon


Obtenir cette erreur en effectuant votre solution "AttributeError: (" peut seulement utiliser l'accessor .str avec des valeurs de chaîne (c'est-à-dire une "chaîne", "chaîne", "unicode" ou "mixte") "," eu lieu à index pass_dnw '


Bien sûr, il peut être maximum de 40 colonnes et peut être de n'importe quel mot. Comme Pass_Does, Pass_Dnw, Pass_sig: 2. J'ai aussi édité la question principale


Merci, obtenez une erreur comme - ValueError: impossible de réindex à partir d'un axe en double


Ce message d'erreur indique que les noms de colum sont dupliqués. Regardez les listes de colonnes dans la table "préliminaire" et dans sortie_df . Peut-être que vos données d'entrée contiennent le même numéro dans deux Sondage _... colonnes? Ensuite, le Dataframe préliminaire contiendrait une répétition. Votre échantillon d'entrée n'inclut pas un tel cas, je ne l'ai donc pas considéré.


J'ai vérifié et j'ai fait une boucle pour chaque ligne, et je n'ai pas pu trouver une valeur dupliquée dans une rangée, je reçois toujours la même erreur


Remplacez la dernière ligne lorsque j'ai écrit dans la modification. Puis exécutez mon code sur des parties de votre fichier d'entrée. Essayez de localiser la ligne qui provoque l'erreur.



0
votes

Créez deux dataframes à partir de DF_Input et de sortie, fusionnez-les et pivotez pour obtenir votre Dataframe final:

#create first dataframe
    res1 = pd.wide_to_long(df,
                       stubnames='Pass',
                       i='id',
                       j='letters',
                       sep='_',
                       suffix='[A-Z]').reset_index()
                          )
res1

     id letters Pass
0   110101  X   1
1   110102  X   2
2   110101  Y   2
3   110102  Y   1
4   110101  Z   4
5   110102  Z   3

#create second dataframe
res2 = (df1
        .melt('id')
        .drop('value', axis=1)
        .assign(numbers=lambda x: x.variable.str.split('_').str.get(-1))
        .astype( {'numbers': int})
       )

res2

      id    variable    numbers
0   110101  Pass_01       1
1   110102  Pass_01       1
2   110101  Pass_02       2
3   110102  Pass_02       2
4   110101  Pass_03       3
5   110102  Pass_03       3

#merge the two dataframes, and pivot to get ur final output

outcome = (res1
           .merge(res2,
                  left_on=['id','Pass'],
                  right_on=['id','numbers'],
                  how='right')
           .pivot(columns='variable',values='letters',index='id')
           .bfill()
           .reset_index()
           .rename_axis(columns=None)
          )

outcome

      id    Pass_01 Pass_02 Pass_03
0   110101     X       Y       Z
1   110102     Y       X       Z


0 commentaires

0
votes

Vous pouvez le faire avec Stack code> , instable code> et certains set_index code> et réinitialiser_index code> pour jouer avec quelles colonnes sont dans la logique.

df2 = (df1.set_index('id') #set index any columns not in the logic of pass
          # remove the prefix Pass_
          .rename(columns=lambda col: col.replace('Pass_', ''))
          # stack the datafrae to make it a serie and sort the passes
          .stack().sort_values()
          # next two method exchange the old pass index to the new pass index
          .reset_index(level=1, name='Pass')
          .set_index('Pass', append=True)['level_1']
          # from the serie to the dataframe shape
          .unstack()
          # rename the columns with the prefix pass_
          .rename(columns=lambda col: f'Pass_{col:02}')
          # rename axis to none
          .rename_axis(None, axis=1)
          # but back the id as a column
          .reset_index())

print (df2)
       id Pass_01 Pass_02 Pass_03
0  110101       X       Y       Z
1  110102       Y       X       Z


0 commentaires