J'ai deux cadres de données pandas, chacun ayant une colonne de date. J'ai besoin de trouver les lignes qui n'ont pas de date commune
En supposant que j'ai créé un index sur la colonne de date, il existe des solutions pour trouver les lignes avec un index commun comme celui-ci Mais je ne trouve aucune solution élégante pour trouver les lignes qui n'ont pas de date commune. par exemple. df1
value 2 24/11/2000 -0.004808 27/11/2000 -0.001812
df2
value 1 01/12/2000 0.012749 04/12/2000 0.113892
donne deux dataframes: l'un qui contient les lignes de df1 qui n'ont pas de dates communes
df11
values 2 24/11/2000 -0.004808 27/11/2000 -0.001812 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480
Et l'autre qui contient les lignes de df2 qui n'ont pas les dates communes df22
values 1 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 01/12/2000 0.012749 04/12/2000 0.113892
Je suis d'accord avec tout autre format de sortie, par exemple avoir à la fois la sortie de la trame de données dans une seule trame de données, si nous pouvons réduire le nombre d'étapes.
Il existe des solutions pour trouver les lignes qui ne sont pas égales les unes aux autres comme ça , mais alors chaque élément de la ligne doit être le même.
Quelqu'un peut-il vous aider à trouver une solution élégante. Merci pour toute contribution
3 Réponses :
Utilisez Index.difference code>
:
df11 = df1.loc[np.setdiff1d(df1.index, df2.index)] df22 = df2.loc[np.setdiff1d(df2.index, df1.index)]
Solution Numpy avec numpy.setdiff1d
:
df11 = df1.loc[df1.index.difference(df2.index)] print (df11) values 1 01/12/2000 0.012749 04/12/2000 0.113892 df22 = df2.loc[df2.index.difference(df1.index)] print (df22) values 2 24/11/2000 -0.004808 27/11/2000 -0.001812
Sans réindexation, j'obtiendrais les dates uniques de chaque df, puis je masquerais l'autre en utilisant ces dates. Quelque chose comme
df1 = df1[~df1['date'].isin(df2['date'].unique())] df2 = df2[~df2['date'].isin(df1['date'].unique())]
Les 3 solutions, y compris celle-ci et celle utilisant index.difference et merge ont fonctionné. Choisir celle-ci comme réponse car c'est la moins compliquée du moins pour moi et ne nécessite pas de fixer un index.
Il y a de la magie dans la fusion
en utilisant indicator
s=df1.merge(df2,left_index=True,right_index=True,indicator=True,how='outer') df1_1=s.loc[s['_merge']=='left_only',['values1']] df2_2=s.loc[s['_merge']=='right_only',['values2']] df1_1 values1 01/12/2000 0.012749 04/12/2000 0.113892 df2_2 values2 24/11/2000 -0.004808 27/11/2000 -0.001812