Maison > développement back-end > Tutoriel Python > Fusionner de la largeur à la longueur

Fusionner de la largeur à la longueur

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-09 23:50:04
avant
756 Les gens l'ont consulté

Fusionner de la largeur à la longueur

Contenu de la question

Bonjour, j'essaie de fusionner deux ensembles de données via :

df1=pd.dataframe({'company name':['a','b','c'],
               'analyst 1 name':['tom','mike',np.nan],
               'analyst 2 name':[np.nan,'alice',np.nan],
               'analyst 3 name':['jane','steve','alex']})

df2=pd.dataframe({'company name':['a','b','c'],
               'score 1':[3,5,np.nan],
               'score 2':[np.nan,1,np.nan],
               'score 3':[6,np.nan,11]})

df_desire=pd.dataframe({'company name':['a','a','b','b','b','c'],
               'analyst':['tom','jane','mike','alice','steve','alex'],
               'score':[3,6,5,1,np.nan,11]})
Copier après la connexion

Fondamentalement, df1 contient le nom de l'analyste et df2 contient le score attribué par l'analyste. J'essaie de fusionner les deux dans df_desire. La méthode de lecture des deux tableaux est la suivante : pour la société a, elle est couverte par deux personnes, à savoir Tom et Jane, qui attribuent respectivement 3 et 6. Notez que bien que Steve couvre la société b, je spécifie intentionnellement le score comme na à des fins de robustesse.

Ce que j'ai fait c'est :

pd.concat([df1.melt(id_vars='company name',value_vars=['analyst 1 name','analyst 2 name','analyst 3 name']),\
           df2.melt(id_vars='company name',value_vars=['score 1','score 2','score 3'])],axis=1)
Copier après la connexion

Je recherche une solution plus élégante.


Bonne réponse


Essayez :

x = (
    df1.set_index("company name")
    .stack(dropna=false)
    .reset_index(name="name")
    .drop(columns="company name")
)
y = df2.set_index("company name").stack(dropna=false).reset_index(name="score")

print(
    pd.concat([x, y], axis=1)[["company name", "name", "score"]]
    .dropna(subset=["name", "score"], how="all")
    .reset_index(drop=true)
)
Copier après la connexion

Impression :

  company name   name  score
0            A    Tom    3.0
1            A   Jane    6.0
2            B   Mike    5.0
3            B  Alice    1.0
4            B  Steve    NaN
5            C   Alex   11.0
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal