2016-11-15 3 views
1

У меня есть dataframe, который выглядит следующим образом:Создать Numpy массив из столбцов панд dataframe

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

Я хотел бы создать Numpy массив из этих данных, используя колонку А в качестве индекса, столбец B в качестве заголовки столбцов и столбца C в качестве данных заполнения. В конце концов, это должно выглядеть так:

 2 5 8 
1 3 3  
4 1   2 

Есть ли хороший способ сделать это? Я пробовал df.pivot_table, но я волнуюсь, что испортил данные, и я предпочел бы сделать это другим, более интуитивно понятным способом.

+2

Нет, вы не можете иметь пустые * ячейки * в массиве. Почему бы не заполнить эти пустые ячейки/пробелы каким-либо недопустимым спецификатором типа '0s' или' NaNs' или что-то еще? – Divakar

+0

Yup, заполнение нулями будет отлично работать. Я просто собирался применить df.fillna (0) – Nate

ответ

4

манипулировать dataframe как этот

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

enter image description here

Или

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

enter image description here


получить Num пй массив как этот

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

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

Или

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

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

Или, 'pandas.pivot_table' – Kartik

1

Pandas выглядели хорошо разборки! Итак, я думал, давайте попробуем повторить то же поведение с NumPy, которые могли бы работать на массивах и в конечном итоге что-то вроде этого -

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 

Пример запуска -

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

Как уже упоминалось выше, вы можете использовать pd.pivot_table например

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 
Смежные вопросы