2017-07-12 7 views
0

Wie würde ich die Zeilen erhalten, die in einigen Spalten für zwei Datenrahmen identisch sind, aber in einer bestimmten Spalte anders sind?Reihen in bestimmten Spalten, andere in anderen Spalten

zB

die Zeilen Auswahl, die die gleichen Werte in den 2 dfs für cols haben [A, B, C], haben aber unterschiedliche Wert für Spalte 'tatsächliche'

import pandas as pd 
df = pd.DataFrame({"A":list(range(10)), 
        "B":list(range(10,20)), 
        "C":list(range(20,30)), 
        "D":list(range(30,40)), 
        "actual":[1 for x in range(10)]}) 

df2 = pd.DataFrame({"A":list(range(15)), 
        "B":list(range(5,20)), 
        "C":list(range(15,30)), 
        "D":list(range(45,60)), 
        "actual":[0 for x in range(15)]}) 

    df.iloc[5] = [5,10,20,20,1] 
Out[12]: 
    A B C D actual 
0 0 10 20 30  1 
1 1 11 21 31  1 
2 2 12 22 32  1 
3 3 13 23 33  1 
4 4 14 24 34  1 
5 5 10 20 20  1 
6 6 16 26 36  1 
7 7 17 27 37  1 
8 8 18 28 38  1 
9 9 19 29 39  1 

df2 
Out[13]: 
    A B C D actual 
0 0 5 15 45  0 
1 1 6 16 46  0 
2 2 7 17 47  0 
3 3 8 18 48  0 
4 4 9 19 49  0 
5 5 10 20 50  0 
6 6 11 21 51  0 
7 7 12 22 52  0 
8 8 13 23 53  0 
9 9 14 24 54  0 
10 10 15 25 55  0 
11 11 16 26 56  0 
12 12 17 27 57  0 
13 13 18 28 58  0 
14 14 19 29 59  0 

Ich möchte alle Indizes in df2, die in df1 gleich sind, aber unterschiedliche "tatsächliche" Werte haben. Zum Beispiel

A B C D 
5 10 20 50 

das ist Index 5 in DF2.

Konnte jemand helfen? :)

+1

'A: 5, B: 10, C: 20, D: 50' erscheint nicht im ersten df? – ayhan

+0

@ayhan Mein schlechtes, repariert! – Wboy

Antwort

3
df.merge(df2, on=list('ABCD')) 

gibt Ihnen einen DataFrame, wo beide DataFrames die gleichen Werte auf denen für Spalten haben. Für die Spalte actual werden zwei Spalten generiert: actual_x und actual_y.

A B C D actual_x actual_y 
0 5 10 20 50   1   0 

Wenn Sie einen anderen Zustand übergeben werden soll, kann dies mit geschehen:

df.merge(df2, on=list('ABCD'))[lambda v: v['actual_x'] != v['actual_y']] 
# Or 
df.merge(df2, on=list('ABCD')).query('actual_x != actual_y') 

Dies wird Ihnen ein Datenrahmen in dem beide df die die gleichen Werte auf ABCD haben aber unterschiedliche Werte auf die actual Säule.

+0

Ich bin mir nicht sicher, ob Sie die Spalte "D" in die Zusammenführung einfügen möchten, aber wenn nicht, können Sie sie einfach fallen lassen. Dann wird es 'D_x' und' D_y' erzeugen. Wenn Sie das auf dem zweiten DataFrame haben wollen, dann können Sie es einfach mit '[D_y]' indizieren. – ayhan

+0

Dies stürzt auf großen Datenframes ab. Gibt es eine Möglichkeit, nur die Indizes der Zeilen zu erhalten? zB [1,4], wenn die gemeinsame Zeile den Index 1 in df1 und 4 in df2 @ayhan – Wboy

+0

hat. Nach der Zusammenführung ja. Aber wenn Sie das ohne die Zusammenführung tun möchten, können Sie jede einzelne Spalte selbst überprüfen, aber ich bin nicht sicher, ob das helfen wird. Stürzt es wegen Speicher ab? Wie groß sind die DataFrames? – ayhan

Verwandte Themen