2016-04-20 13 views
1

Ich habe zwei Datenrahmen, von wo aus ich die eindeutigen Werten einer Spalte in a und b extrahierenJoin eindeutige Werte in neuen Datenrahmen (Python, Pandas)

a = df1.col1.unique() 
b = df2.col2.unique() 

jetzt a und b sind so etwas wie diese

['a','b','c','d'] #a 
[1,2,3] #b 

sie jetzt geben numpy.ndarray

ich möchte sie verbinden diese einen Datenrahmen zu haben, wie

col1 col2 
0 a  1 
1 a  2 
3 a  3 
4 b  1 
5 b  2 
6 b  3 
7 c  1 
    . . . 

Gibt es eine Möglichkeit, dies nicht mit einer Schleife zu tun?

+0

Ist ein Listenverständnis akzeptabel? –

+0

Ich brauche es DataFrame –

+0

@RoseAlejandra - Nein, ich frage, ob ein Listenverständnis akzeptabel ist, um den DataFrame zu erstellen. Sie sagen ohne eine for-Schleife, die Aufzählungen implizit verwenden, aber nicht explizit. –

Antwort

0

UPDATE:

BM-Lösung unter Verwendung von numpy ist viel schneller - ich würde empfehlen, seinen Ansatz zu verwenden:

In [88]: %timeit pd.DataFrame({'col1':np.repeat(aa,bb.size),'col2':np.tile(bb,aa.size)}) 
10 loops, best of 3: 25.4 ms per loop 

In [89]: %timeit pd.DataFrame(list(product(aa,bb)), columns=['col1', 'col2']) 
1 loop, best of 3: 1.28 s per loop 

In [90]: aa.size 
Out[90]: 1000 

In [91]: bb.size 
Out[91]: 1000 

versuchen itertools.product:

In [56]: a 
Out[56]: 
array(['a', 'b', 'c', 'd'], 
     dtype='<U1') 

In [57]: b 
Out[57]: array([1, 2, 3]) 

In [63]: pd.DataFrame(list(product(a,b)), columns=['col1', 'col2']) 
Out[63]: 
    col1 col2 
0  a  1 
1  a  2 
2  a  3 
3  b  1 
4  b  2 
5  b  3 
6  c  1 
7  c  2 
8  c  3 
9  d  1 
10 d  2 
11 d  3 
+0

Da 'itertools.product (a, b)' gibt einen Iterator bestehend aus Tupeln, vermute ich das zusätzliche Listenverständnis zu '[[x [0], x [1]]' war unnötig. –

+0

@AkshatMahajan, danke! Ich habe es auch schon herausgefunden :) – MaxU

0

Sie können‘ t tue diese Aufgabe, ohne mindestens eine for-Schleife zu verwenden. Das Beste, was Sie tun können, ist hide die for-Schleife oder verwenden Sie implizite yield Aufrufe, um einen Speicher-effiziente Generator zu machen.

itertools exportiert effiziente Funktionen für diese Aufgabe, die yield verwenden implizit Generatoren zurückzukehren:

from itertools import product 

products = product(['a','b','c','d'], [1,2,3]) 

col1_items, col2_items = zip(*products) 

result = pandas.DataFrame({'col1':col1_items, 'col2': col2_items}) 

itertools.product ein Cartesian product von zwei Iterables schafft. Die zip(*products) entpackt einfach die resultierende Liste von Tupeln in zwei separate Tupel, wie man sieht here.

0

Sie können dies tun, mit Pandas fusionieren und es wird schneller sein als itertools oder eine Schleife:

df_a = pd.DataFrame({'a': a, 'key': 1}) 
df_b = pd.DataFrame({'b': b, 'key': 1}) 
result = pd.merge(df_a, df_b, how='outer') 

Ergebnis:

a key b 
0 a 1 1 
1 a 1 2 
2 a 1 3 
3 b 1 1 
4 b 1 2 
5 b 1 3 
6 c 1 1 
7 c 1 2 
8 c 1 3 
9 d 1 1 
10 d 1 2 
11 d 1 3 

dann, wenn Sie immer werden müssen tun

del result['key'] 
1

mit Werkzeugen:

pd.DataFrame({'col1':np.repeat(a,b.size),'col2':np.tile(b,a.size)}) 
+0

Sehr schöne Lösung! – MaxU