Pandas Dataframe ValueError: Форма переданных значений (X,), индексы подразумевают (X, Y)

Я получаю сообщение об ошибке, и я не уверен, как это исправить.

Кажется, что работает следующее:

def random(row):
   return [1,2,3,4]

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))

df.apply(func = random, axis = 1)

и мой вывод:

[1,2,3,4]
[1,2,3,4]
[1,2,3,4]
[1,2,3,4]

Однако, когда я меняю один из столбцов на значение, такое как 1 или Нет:

def random(row):
   return [1,2,3,4]

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))
df['E'] = 1

df.apply(func = random, axis = 1)

Я получаю ошибку:

ValueError: Shape of passed values is (5,), indices imply (5, 5)

Я боролся с этим в течение нескольких дней, и ничего не работает. Интересно, что когда я изменяю

def random(row):
   return [1,2,3,4]

to

def random(row):
   print [1,2,3,4]

все работает нормально.

Этот вопрос является более ясным способом задавать этот вопрос, который, по моему мнению, может быть запутанным.

Моя цель - вычислить список для каждой строки, а затем создать столбец из этого.

EDIT: Я изначально начинаю с фрейма данных, содержащего один столбец. Я добавляю 4 столбца в 4 шага применения разницы, а затем, когда я пытаюсь добавить другой столбец, я получаю эту ошибку.

Ответы

Ответ 1

Если ваша цель - добавить новый столбец в DataFrame, просто напишите свою функцию как функцию, возвращающую скалярное значение (не список), что-то вроде этого:

>>> def random(row):
...     return row.mean()

а затем примените:

>>> df['new'] = df.apply(func = random, axis = 1)
>>> df
          A         B         C         D       new
0  0.201143 -2.345828 -2.186106 -0.784721 -1.278878
1 -0.198460  0.544879  0.554407 -0.161357  0.184867
2  0.269807  1.132344  0.120303 -0.116843  0.351403
3 -1.131396  1.278477  1.567599  0.483912  0.549648
4  0.288147  0.382764 -0.840972  0.838950  0.167222

Я не знаю, возможно ли, чтобы ваш новый столбец содержал списки, но в конечном итоге можно было содержать кортежи ((...) вместо [...]):

>>> def random(row):
...    return (1,2,3,4,5)
...
>>> df['new'] = df.apply(func = random, axis = 1)
>>> df
          A         B         C         D              new
0  0.201143 -2.345828 -2.186106 -0.784721  (1, 2, 3, 4, 5)
1 -0.198460  0.544879  0.554407 -0.161357  (1, 2, 3, 4, 5)
2  0.269807  1.132344  0.120303 -0.116843  (1, 2, 3, 4, 5)
3 -1.131396  1.278477  1.567599  0.483912  (1, 2, 3, 4, 5)
4  0.288147  0.382764 -0.840972  0.838950  (1, 2, 3, 4, 5)