web-dev-qa-db-fra.com

Comment fusionner deux lignes dans un pandas dataframe

J'ai une base de données avec deux lignes et j'aimerais fusionner les deux lignes en une ligne. Le df se présente comme suit:

              PC           Rating CY   Rating PY    HT
0             DE101           NaN            AA     GV
0             DE101           AA+           NaN     GV

J'ai essayé de créer deux images distinctes et de les combiner avec df.merge (df2) sans succès. Le résultat devrait être le suivant

              PC           Rating CY   Rating PY    HT
0             DE101           AA+            AA     GV

Des idées? Merci d'avance La mise à jour pourrait-elle être une solution possible?

MODIFIER:

df.head(1).combine_first(df.tail(1))

Cela fonctionne pour l'exemple ci-dessus. Cependant, pour les colonnes contenant des valeurs numériques, cette approche ne produit pas le résultat souhaité, par exemple: pour

              PC           Rating CY   Rating PY    HT    MV1   MV2
0             DE101           NaN            AA     GV    0     20 
0             DE101           AA+           NaN     GV    10    0

Le résultat devrait être:

              PC           Rating CY   Rating PY    HT   MV1    MV2
0             DE101           AA+            AA     GV   10     20

La formule ci-dessus ne résume pas les valeurs des deux dernières colonnes, mais prend les valeurs de la première ligne du cadre de données.

              PC           Rating CY   Rating PY    HT   MV1    MV2
0             DE101           AA+            AA     GV   0     20

Comment ce problème pourrait-il être résolu?

6
Carmen

Vous pouvez utiliser la méthode DF.combine_first() après avoir séparé la DF en 2 parties où les valeurs nulles de la première moitié seraient remplacées par les valeurs finies de l'autre moitié tout en conservant ses autres valeurs finies:

df.head(1).combine_first(df.tail(1))
# Practically this is same as → df.head(1).fillna(df.tail(1))

 enter image description here


S'il y a des colonnes de types de données mixtes, les partitionner en ses colonnes dtype constitutives, puis effectuer diverses opérations dessus serait réalisable en les chaînant.

obj_df = df.select_dtypes(include=[np.object])
num_df = df.select_dtypes(exclude=[np.object])

obj_df.head(1).combine_first(obj_df.tail(1)).join(num_df.head(1).add(num_df.tail(1)))

 enter image description here

4
Nickil Maveli

Vous pouvez utiliser max avec transpose comme

In [2103]: df.max().to_frame().T
Out[2103]:
      PC Rating CY Rating PY  HT MV1 MV2
0  DE101       AA+        AA  GV  10  20
3
Zero