2017-05-08 6 views
1

Ich bin auf der Suche nach Datenrahmen df1 und df2 zu kombinieren, um df3 in Python zu erhalten, am besten in einem Einzeiler (das heißt, nein "für alle x in df1.LETS. .. ").Kombinieren Sie zwei verschiedene Datenrahmen, um alle möglichen Iterationen anzuzeigen

Ich bin bei einem aktuellen Verlust für Wörter mit meinem Google-Fu zu verwenden, also hier bin ich bei StackExchange, in der Hoffnung, dass ein anderer Programmierer helfen kann, meine geistige Leere mit dieser misslichen Lage zu füllen.

Vielen Dank!

df1 df2  df3 
LETS NUMS  LETS NUMS 
A  1  A  1 
B  2  A  2 
     3  A  3 
     4  A  4 
       B  1 
       B  2 
       B  3 
       B  4 

Antwort

1
pd.DataFrame(index=pd.MultiIndex.from_product([df1.LETS, df2.NUMS], 
          names=("LETS", "NUMS"))).reset_index() 
# LETS NUMS 
#0 A  1 
#1 A  2 
#2 A  3 
#3 A  4 
#4 B  1 
#5 B  2 
#6 B  3 
#7 B  4 
2

können Sie verwenden:

df1 = pd.DataFrame({'LETS':list('AB')}) 
df2 = pd.DataFrame({'NUMS':range(1,5)}) 

cross join Lösung mit merge + assign Säule mit constant und drop Helfer Spalte A:

df = pd.merge(df1.assign(A=1), df2.assign(A=1), on='A').drop('A', axis=1) 
print (df) 
    LETS NUMS 
0 A  1 
1 A  2 
2 A  3 
3 A  4 
4 B  1 
5 B  2 
6 B  3 
7 B  4 

Eine andere Lösung mit MultiIndex.from_product und neue Funktion in Pandas 0.20.1 - MultiIndex.to_frame

df = pd.MultiIndex.from_product([df1['LETS'], df2['NUMS']]).to_frame() 
df.columns = ['LETS','NUMS'] 
print (df) 
    LETS NUMS 
A 1 A  1 
    2 A  2 
    3 A  3 
    4 A  4 
B 1 B  1 
    2 B  2 
    3 B  3 
    4 B  4 

print (df.reset_index(drop=True)) 
    LETS NUMS 
0 A  1 
1 A  2 
2 A  3 
3 A  4 
4 B  1 
5 B  2 
6 B  3 
7 B  4 
Verwandte Themen