2016-06-29 3 views
1

Скажем, у меня есть очень простой кадр данных:ValueError, когда применяются функции для кадра данных в питона-панд

import pandas as pd 
df = pd.DataFrame(np.full((6), 1)) 

Теперь я собираюсь определить функцию, генерировать Numpy массив произвольной длины и добавить Приведенное значение к хвосту:

import numpy as np 
def func(row): 
    l = np.full((np.random.random_integer(5)), 1) 
    return np.hstack(l, row) 

Когда я пытаюсь применить функцию к df, чтобы получить 2-D array:

df.apply(func, axis=1), 

я получил такую ​​ошибку:

ValueError: Shape of passed values is (6, 2), indices imply (6, 1) 

Знаете ли вы, что это проблема и как это исправить? Заранее спасибо!

+0

'random_integet' не является функцией np, вы можете обновить код с помощью чего-то, что работает – EdChum

+0

@EdChum Извините, я уже исправил ошибку. Спасибо – user5779223

ответ

1

Во-первых, вы хотите np.random.random_integers, во-вторых hstack принимает кортеж так передать кортеж, в-третьих вы должны вернуть то, что он может выравнивать с так что в этом случае Series:

In [213]: 
df = pd.DataFrame(np.full((6), 1)) 
def func(row): 
    l = np.full((np.random.random_integers(5)), 1) 
    return pd.Series(np.hstack((l, row))) 

In [214]:  
df.apply(func, axis=1) 

Out[214]: 
    0 1 2 3 4 5 
0 1.0 1.0 1.0 NaN NaN NaN 
1 1.0 1.0 NaN NaN NaN NaN 
2 1.0 1.0 NaN NaN NaN NaN 
3 1.0 1.0 1.0 NaN NaN NaN 
4 1.0 1.0 1.0 1.0 1.0 NaN 
5 1.0 1.0 1.0 1.0 1.0 1.0 

Обратите внимание, что я получаю тонну предупреждений о выше:

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\numeric.py:301: FutureWarning: in the future, full(3, 1) will return an array of dtype('int32') 
    format(shape, fill_value, array(fill_value).dtype), FutureWarning) 
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\numeric.py:301: FutureWarning: in the future, full(2, 1) will return an array of dtype('int32') 
    format(shape, fill_value, array(fill_value).dtype), FutureWarning) 
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\numeric.py:301: FutureWarning: in the future, full(1, 1) will return an array of dtype('int32') 
    format(shape, fill_value, array(fill_value).dtype), FutureWarning) 
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\numeric.py:301: FutureWarning: in the future, full(4, 1) will return an array of dtype('int32') 
    format(shape, fill_value, array(fill_value).dtype), FutureWarning) 
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\numeric.py:301: FutureWarning: in the future, full(5, 1) will return an array of dtype('int32') 
    format(shape, fill_value, array(fill_value).dtype), FutureWarning) 

Чтобы получить массив нп от атрибута ДФ вызова values:

df.apply(func, axis=1).values 
+0

Спасибо за ваш волшебный ответ! Но могу ли я перенести его на двухмерный массив или матрицу? Благодаря! – user5779223

+0

Можете ли вы объяснить, что вы имеете в виду, отредактировав свой вопрос с желаемым результатом – EdChum

+0

Я уже редактировал вопрос. На самом деле, я просто хочу, чтобы на выходе был массив numpy вместо рядов. Благодарю. – user5779223

Смежные вопросы