Ответ 1
Если вы попытаетесь вернуть несколько значений из функции, переданной в apply
, а DataFrame, который вы вызываете apply
on, имеет такое же количество элементов вдоль оси (в этом случае столбцы), как число значения, которые вы вернули, Pandas создаст DataFrame из возвращаемых значений с теми же ярлыками, что и исходный DataFrame. Вы можете увидеть это, если вы просто выполните:
>>> def test(row):
return [1, 2, 3]
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df.apply(test, axis=1)
A B C
0 1 2 3
1 1 2 3
2 1 2 3
3 1 2 3
И вот почему вы получаете ошибку, поскольку вы не можете назначить столбец DataFrame в DataFrame.
Если вы вернете любое другое количество значений, оно вернет только объект серии, который может быть назначен:
>>> def test(row):
return [1, 2]
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df.apply(test, axis=1)
0 [1, 2]
1 [1, 2]
2 [1, 2]
3 [1, 2]
>>> df['D'] = df.apply(test, axis=1)
>>> df
A B C D
0 0.333535 0.209745 -0.972413 [1, 2]
1 0.469590 0.107491 -1.248670 [1, 2]
2 0.234444 0.093290 -0.853348 [1, 2]
3 1.021356 0.092704 -0.406727 [1, 2]
Я не уверен, почему Pandas делает это, и почему он делает это только тогда, когда возвращаемое значение является list
или ndarray
, так как оно не будет работать, если вы вернете tuple
>>> def test(row):
return (1, 2, 3)
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df['D'] = df.apply(test, axis=1)
>>> df
A B C D
0 0.121136 0.541198 -0.281972 (1, 2, 3)
1 0.569091 0.944344 0.861057 (1, 2, 3)
2 -1.742484 -0.077317 0.181656 (1, 2, 3)
3 -1.541244 0.174428 0.660123 (1, 2, 3)