2
votes

Comment trouver les lignes qui ne partagent PAS une date (ou un index) commun dans un dataframe Python

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


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

2
votes

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())]


1 commentaires

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.



1
votes

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


0 commentaires