Je voudrais en fusionner deux DataFrames
et conserver l'index de la première image en tant qu'index sur l'ensemble de données fusionné. Cependant, lorsque je fais la fusion, le DataFrame résultant a un index entier. Comment puis-je spécifier que je souhaite conserver l'index du bloc de données gauche?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
EDIT: Passé à un exemple de code qui peut être facilement reproduit
Réponses:
Remarque: pour certaines opérations de fusion à gauche, vous pouvez vous retrouver avec plus de lignes s'il y a plusieurs correspondances entre
a
etb
et vous devrez dédupliquer ( documentation pour la déduplication ). C'est pourquoi pandas ne garde pas l'index pour vous.la source
a
image d' origine . reset_index déplace l'index vers une colonne normale et set_index de cette colonne après la fusion prend également soin lorsque les lignes d'un sont dupliquées / supprimées en raison de l'opération de fusion.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Vous pouvez faire une copie de l'index sur la trame de données gauche et procéder à la fusion.
J'ai trouvé cette méthode simple très utile tout en travaillant avec une grande trame de données et en utilisant
pd.merge_asof()
(oudd.merge_asof()
).Cette approche serait meilleure lorsque la réinitialisation de l'index est coûteuse (grande trame de données).
la source
Il existe une solution non-pd.merge. Utilisation
map
etset_index
Et n'introduit pas de
index
nom factice pour l'index.la source
pd.Dataframe
et pas unpd.Series
. La.map()
méthode n'est définie que pour lepd.Series
. Cela signifie que:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
ne fonctionnera pas.Cela permet de conserver l'index de df1
la source
on=list_of_cols]
, elle contredit la documentation:If joining columns on columns, the DataFrame indexes *will be ignored*
. Est-ce que l'un de l'utilisation d'indices par rapport aux colonnes a la priorité?Je pense avoir trouvé une solution différente. Je rejoignais la table de gauche sur la valeur d'index et la table de droite sur une valeur de colonne basée sur l'index de la table de gauche. Ce que j'ai fait était une fusion normale:
Ensuite, j'ai récupéré les nouveaux numéros d'index de la table fusionnée et les ai mis dans une nouvelle colonne nommée Numéro de ligne de sentiment:
Ensuite, je redéfinis manuellement l'index sur l'index de table de gauche d'origine en fonction de la colonne préexistante appelée Numéro de ligne (la valeur de la colonne à laquelle j'ai rejoint l'index de la table de gauche):
Ensuite, supprimez le nom d'index du numéro de ligne afin qu'il reste vide:
Peut-être un peu un hack mais semble bien fonctionner et relativement simple. De plus, supposez que cela réduit le risque de doublons / de falsification de vos données. Espérons que tout a du sens.
la source
une autre option simple est de renommer l'index comme avant:
merge préserve l'ordre au dataframe 'a', mais réinitialise simplement l'index pour qu'il soit sauvegardé pour utiliser set_axis
la source