Ich kann nicht einen einfachen Weg finden, alle Zeilen eines Datenrahmens, die in einem Datenrahmen, aber nicht in einem zweiten Datenrahmen gefunden werden, wenn die Daten nicht geordnet sind.Pandas alle Zeilen in einem Datenrahmen, aber nicht die anderen gelisteten UNORDERD
Diese beiden Antworten Talk sind Lösungen für geordnete Daten:
Get rows that are present in one dataframe, but not the other
So einfach machen es klar, ich versuche, diese zu bekommen:
In einer der oben genannten verwandten Frage I Ich habe eine Multiindex-Lösung gefunden, die angeblich mit ungeordneten Daten arbeitet, aber ich konnte sie nicht implementieren. Ich hoffe, es gibt einen leichteren Weg.
lassen Sie mich Ihnen ein Beispiel für die Daten mit Ich arbeite:
DF1
col_a col_b
1325 foo
1397 foo #<---matching value, but not matching index in DF2
1645 foo
... ...
DF2
col_1 col_2
1397 foo #<---matching value, but not matching index in DF1
1500 foo
1621 foo
... ...
Nun, wenn das in den beiden Datenrahmen alle Daten waren das Ergebnis dieses für DF1 speziell für die Verarbeitung würde wie folgt aussehen:
DF1_UNIQUE
col_a col_b
1325 foo
1645 foo
(also wirklich nur ich die Sorge um col_a
oder für DF2 col_1
). Beachten Sie, dass die Zeile 1397 fehlt. Das liegt daran, dass es in DF2 gefunden wird, also möchte ich nicht, dass es zu meinem neuen DF zurückkehrt. Aber es ist nicht im selben Index gefunden und da liegt das Problem, das ich habe. Ich habe bereits eine Lösung leicht erstellt, wenn alle übereinstimmenden Indizes aufgereiht sind, aber ich weiß nicht, wo ich auf den nicht aufgereihten Indizes anfangen soll. Kann ich die Zusammenführungsfunktion verwenden? Oder ist das das falsche Werkzeug für diesen Job?
Dieser Code ist nicht ganz relevant, aber es ist die Lösung kam ich mit, wenn alle Indizes ausgekleidet richtig:
def getUniqueEntries(df1, df2):
"""takes two dataframes, returns a dataframe that is comprized of all the rows unique to the first dataframe."""
d1columns = df1.columns
d2columns = df2.columns
df3 = pd.merge(df1, df2, left_on=d1columns[0], right_on=d2columns[0])
print(df3)
return df1[(~df1[d1columns[0]].isin(df3[d1columns[0]]))]
def main(fileread1, fileread2, writeprefix):
df1 = pd.read_csv(fileread1)
df2 = pd.read_csv(fileread2)
df3 = getUniqueEntries(df1, df2)
df4 = getUniqueEntries(df2, df1)
print(df3)
print(df4)
df3.to_csv(writeprefix+fileread1, index=False)
df4.to_csv(writeprefix+fileread2, index=False)
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2], sys.argv[3])
Schön, ich wusste nicht über "Indikator" -Parameter – MaxU
@ MaxU und ich wusste nicht, dass Sie ein Diktat an "Isin" übergeben können. :) – ayhan
danke allen, die geantwortet haben! Diese Antwort ist für mich am einfachsten zu verstehen, ich bin 1 Tag neu bei Pandas, nochmals vielen Dank! –