2016-11-15 4 views
1

ich einen Datenrahmen haben, die wie folgt aussieht:erstellen numpy Array von Spalten eines Pandas Datenrahmen

A B C 
1 2 3 
1 5 3 
4 8 2 
4 2 1 

Ich möchte eine numpy Array aus diesen Daten unter Verwendung der Spalte A als Index, Spalte B erstellen, wie die Spaltenüberschriften und die Spalte C als Fülldaten. Am Ende sollte es so aussehen:

 2 5 8 
1 3 3  
4 1   2 

Gibt es eine gute Möglichkeit, dies zu tun? Ich habe versucht, df.pivot_table, aber ich bin besorgt, ich habe die Daten durcheinander gebracht, und ich würde es lieber auf eine andere, intuitivere Art und Weise tun.

+2

Nein, Sie können keine leeren * Zellen * in einem Array haben. Warum füllen Sie diese leeren Zellen/Leerzeichen nicht mit einem ungültigen Spezifizierer wie "0" oder "NaN" oder etwas anderem? – Divakar

+0

Yup, das Auffüllen mit Nullen würde großartig funktionieren. Ich wollte nur df.fillna (0) – Nate

Antwort

4

manipulieren, um die Datenrahmen wie diese

df.set_index(['A', 'B']).C.unstack() 

enter image description here

Oder

df.set_index(['A', 'B']).C.unstack(fill_value='') 

enter image description here


die num bekommen py Array wie diese

df.set_index(['A', 'B']).C.unstack().values 

array([[ 3., 3., nan], 
     [ 1., nan, 2.]]) 

Oder

df.set_index(['A', 'B']).C.unstack(fill_value='').values 

array([[3, 3, ''], 
     [1, '', 2]], dtype=object) 
+1

Oder, 'pandas.pivot_table' anwenden – Kartik

1

Pandas Entstapelungsunterdrückung sah nett aus! Also, ich dachte, wollen wir versuchen, das gleiche Verhalten mit NumPy zu replizieren, die auf Arrays und am Ende so etwas wie dies funktionieren könnte -

def numpy_unstack(a, fillval=0): 
    r = np.unique(a[:,0],return_inverse=1)[1] 
    c = np.unique(a[:,1],return_inverse=1)[1] 
    out = np.full((r.max()+1,c.max()+1),fillval) 
    out[r,c] = a[:,2] 
    return out 

Probelauf -

In [81]: df 
Out[81]: 
    0 1 2 
0 1 2 3 
1 1 5 3 
2 4 8 2 
3 4 2 1 

In [82]: numpy_unstack(df.values,0) 
Out[82]: 
array([[ 3., 3., 0.], 
     [ 1., 0., 2.]]) 

In [83]: numpy_unstack(df.values,np.nan) 
Out[83]: 
array([[ 3., 3., nan], 
     [ 1., nan, 2.]]) 
0

Wie oben erwähnt, können Sie pd.pivot_table verwenden wie

In [1655]: df.pivot_table(index='A', columns='B', values='C', fill_value='') 
Out[1655]: 
B 2 5 8 
A 
1 3 3 
4 1  2 
Verwandte Themen