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

Fusionner de la largeur à la longueur

WBOY
Libérer: 2024-02-09 23:50:04
avant
712 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!

source:stackoverflow.com
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