2016-06-23 9 views
1

Ich möchte vollständige Zusammenführung zwischen den Werten von zwei Spalten (Name) von zwei verschiedenen Datenrahmen durchführen. Zusammenführen sollte nur zwischen Namen durchgeführt werden, die mit demselben Alphabet beginnen. Für z. ABC sollte mit allen Namen anderer Datenrahmen zusammengeführt werden, die mit dem Buchstaben 'A' beginnen. Und das sollte für alle Buchstaben "A" bis "Z" gemacht werden. Ich schreibe den folgenden Code. Aber die Länge der vollständigen Zusammenführung zeigt 0 an. Ich möchte auch das Ergebnis, das nach dem Zusammenführen erhalten wurde, basierend auf jedem Buchstaben an einen neuen Datenrahmen anhängen. Welche Änderungen sollte ich vornehmen? Hier ist mein Code -Führen Sie die vollständige Zusammenführung zwischen den Spalten von zwei Datenrahmen, basierend auf dem Startalphabet

for c in ascii_uppercase: 
    df1 = df1[df1.Name.str[0] == c ].copy() 
    df2 = df2[df2.Name.str[0] == c].copy() 
    df1['Join'] =1 
    df2['Join'] =1 
    FullMerge = pd.merge(df2,df1, left_on='Join',right_on='Join') 
    len(FullMerge) 

Antwort

0

ich eine Spalte von ‚first‘ schaffen würde und [merge][1] darauf.

import pandas as pd 
import numpy as np 
from string import ascii_uppercase 

df1 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (5, 3))) 
df1 = df1.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1) 
df1['FirstLetter'] = df1.Name.str.get(0) 

df2 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (1000, 10))) 
df2 = df2.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1) 
df2['FirstLetter'] = df2.Name.str.get(0) 

df1.merge(df2, on='FirstLetter') 

Alles, was Sie sollten mit Ihrem Datenrahmen zu tun haben, ist:

df1['FirstLetter'] = df1.Name.str.get(0) 
df2['FirstLetter'] = df2.Name.str.get(0) 
df1.merge(df2, on='FirstLetter') 

Spalten mit gemeinsamen Namen wird ein Suffix angehängt haben (was Sie steuern können: docs). Alle Spalten sollten dargestellt werden. Vorbehaltlich müssen Sie möglicherweise den Parameter how verwenden, um das Zusammenführungsverhalten auf 'inner' (Standard), 'outer', 'left', 'right', zu ändern.

df1

enter image description here

df2.head()

enter image description here

df1.merge(df2, on='FirstLetter').head()

enter image description here

+0

Was bedeutet (5,3) und (1000,10)? – ComplexData

+0

Das war, was ich verwendet habe, um zufällige Daten zu erzeugen. '(5, 3)' sagt greifen 5 Zeilen und 3 Spalten von zufälligen Buchstaben. Ich schließe mich ihnen an. Das Gleiche gilt für '(1000, 10)'. Sie benötigen diese Datenframes nicht. Ich habe sie nur zur Demonstration benutzt. – piRSquared

+0

Das ist eine erstaunliche Lösung. Ich habe zwei Zweifel - 1. Wie führe ich dies an tatsächlichen Namen in meinen Daten aus? 2. Ich möchte auch andere Spalten intakt von beiden Datenrahmen in meinem Ergebnis behalten. – ComplexData

Verwandte Themen