2017-06-11 4 views
1

Ich versuche, zwei Datenrahmen zusammenführen, eines mit Spalten: customerId, voller Name und E-Mails und das andere Datenfeld mit Spalten: customerId, Menge und Datum. Ich möchte, dass der erste Datenrahmen der Hauptdatenrahmen ist und die anderen Datenrahmeninformationen enthalten sind, aber nur, wenn die customerIds übereinstimmen. Ich habe versucht zu tun:Merge zwei Datenrahmen ohne Wiederholungen Pandas

merge = pd.merge(df, df2, on='customerId', how='left') 

aber der Datenrahmen, die eine Menge Wiederholungen erzeugt wird, enthält und sieht falsch:

customerId full name emails amount date 
0 002963338 Star shine [email protected] $2,910.94 2016-06-14 
1 002963338 Star shine [email protected] $9,067.70 2016-05-27 
2 002963338 Star shine [email protected] $6,507.24 2016-04-12 
3 002963338 Star shine [email protected] $1,457.99 2016-02-24 
4 986423367 palm tree [email protected],[email protected] $4,604.83 2016-07-16 

dies kann nicht richtig sein, bitte helfen!

Antwort

3

Es gibt ein Problem, das Duplikate in customerId Spalte haben.

Also Lösung ist sie zu entfernen, z.B. von drop_duplicates:

df2 = df2.drop_duplicates('customerId') 

Probe:

df = pd.DataFrame({'customerId':[1,2,1,1,2], 'full name':list('abcde')}) 
print (df) 
    customerId full name 
0   1   a 
1   2   b 
2   1   c 
3   1   d 
4   2   e 

df2 = pd.DataFrame({'customerId':[1,2,1,2,1,1], 'full name':list('ABCDEF')}) 
print (df2) 
    customerId full name 
0   1   A 
1   2   B 
2   1   C 
3   2   D 
4   1   E 
5   1   F 

merge = pd.merge(df, df2, on='customerId', how='left') 
print (merge) 
    customerId full name_x full name_y 
0   1   a   A 
1   1   a   C 
2   1   a   E 
3   1   a   F 
4   2   b   B 
5   2   b   D 
6   1   c   A 
7   1   c   C 
8   1   c   E 
9   1   c   F 
10   1   d   A 
11   1   d   C 
12   1   d   E 
13   1   d   F 
14   2   e   B 
15   2   e   D 

df2 = df2.drop_duplicates('customerId') 
merge = pd.merge(df, df2, on='customerId', how='left') 
print (merge) 
    customerId full name_x full name_y 
0   1   a   A 
1   2   b   B 
2   1   c   A 
3   1   d   A 
4   2   e   B 
0

ich nicht wiederholt als Ganze Reihe sehen, aber es gibt repetetions in customerId. Man könnte sie mit entfernen:

df.drop_duplicates('customerId', inplace = 1) 

wo df der Datenrahmen sein könnte entsprechend betragen oder eine erhaltene Post verschmelzen. Falls Sie weniger Zeilen benötigen (zB n), können Sie verwenden:

df.groupby('customerId).head(n) 
Verwandte Themen