2016-12-21 11 views
1

So habe ich zwei Datenfelder, bestehend aus 6 Spalten, die jeweils Zahlen enthalten. Ich muss 1 Spalte von jedem Datenrahmen vergleichen, um sicherzustellen, dass sie alle Werte in dieser Spalte übereinstimmen und korrigieren, die nicht übereinstimmen. Spalten sind bereits sortiert und sie stimmen in der Länge überein. Bisher kann ich die Unterschiede in den Spalten finden:Vergleichen Sie zwei Spalten in Pandas, damit sie übereinstimmen

df1.loc[(df1['col1'] != df2['col2'])] 

dann bekomme ich den Index # wo df1 nicht df2 entspricht. Dann werde ich auf den gleichen Index # in df2 gehen, was Wert in col2, um herauszufinden, verursache eine Diskrepanz dann diese verwendet den Wert auf den richtigen in df2 gefunden zu ändern:

df1.loc[index_number, 'col1'] = new_value 

Gibt es eine Möglichkeit, Kann die Abweichungen automatisch korrigieren, ohne manuell nachsehen zu müssen, was der korrekte Wert in df2 sein sollte?

+0

Sie sollten in der Lage sein zu tun 'df1 überprüfen müssen [DF1! = DF2] = new_value' oder ähnliche – EdChum

+0

Ich bin sicher, es gibt einen Weg zu Mach was du brauchst. Das Problem ist das Erklären, was das ist. Ich weiß nicht, ob Sie die erste Spalte von df1 und die zweite Spalte von df2 wollen. Ist df2 immer die Quelle des neuen Wertes? Sie können die Verwirrung beheben, indem Sie Ihren Beitrag mit einem handgebauten Beispiel bearbeiten, wie es funktionieren soll. – piRSquared

Antwort

1

Ich glaube, Sie von eq vergleichen müssen und dann benötigen, wenn Mehrwert, wo Spiel Verwendung nicht combine_first:

df1 = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,6,5], 
        'E':[5,3,6], 
        'F':[1,4,3]}) 

print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 6 3 4 
2 3 6 9 5 6 3 

df2 = pd.DataFrame({'A':[1,2,1], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df2) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 1 6 9 5 6 3 

Wenn eine Spalte mit allen Datenrahmen vergleichen muss:

print (df1.eq(df2.A, axis=0)) 
     A  B  C  D  E  F 
0 True False False True False True 
1 True False False False False False 
2 False False False False False False 

print (df1.eq(df1.A, axis=0)) 
     A  B  C  D  E  F 
0 True False False True False True 
1 True False False False False False 
2 True False False False False True 

Und wenn die gleiche Spalte :

df1.D = df1.loc[df1.D.eq(df2.D), 'D'].combine_first(df2.D) 
print (df1) 

    A B C D E F 
0 1 4 7 1.0 5 1 
1 2 5 8 3.0 3 4 
2 3 6 9 5.0 6 3 

Aber dann ist einfacher zuweisen nur Spalte Ddf2-D von df1:

df1.D = df2.D 
print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

Wenn Indizes unterschiedlich sind, besteht die Möglichkeit, values für convert Spalte numpy array:

df1.D = df1.D.values 
print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 6 3 4 
2 3 6 9 5 6 3 
+0

Anstatt jede Spalte in beiden dfs zu vergleichen, muss ich nur 1 Spalte von jedem df vergleichen - es sieht nicht so aus, als könnte ich die .eq-Methode auf bestimmte Spalten anwenden. – e9e9s

+0

Siehe letzte Bearbeitung, brauche Parameter 'Achse = 0' – jezrael

+0

Also wenn ich 1 Spalte von jedem vergleichen muss, kann ich auch Achse = 0 auf DF1 verwenden? – e9e9s

1

Wenn df2 die autorisierende Quelle ist, müssen Sie nicht überprüfen, wo df1 gleich

df1.loc[:, 'column_name'] = df2['column_name'] 

Aber wenn wir

c = 'column_name' 
df1.loc[df1[c] != df2[c], c] = df2[c] 
Verwandte Themen