Я звоню apply()
во фрейме данных Pandas, но кажется, что примененная функция вызывается дважды, когда она возвращает массивы, и один раз, когда она возвращает плавающие значения.
Рассмотрим следующий пример.
from pandas import DataFrame
from numpy.random import random
def array_or_float(flag, x):
""" Either return a random array or float depending on `flag` """
if flag:
value = random((2,1))
else:
value = random()
print('Got', round(x, 5), 'returns', value)
return value
df = DataFrame({'A values': random(3)})
df['B values'] = df.apply(lambda x: array_or_float(True, x['A values']), axis=1)
print('\nData frame:')
print(df)
Если я вызову array_or_float(False)
внутри apply()
, т. Е. Если я хочу, чтобы функция возвращала только числа с плавающей запятой, то вывод был бы согласованным.
Got 0.46005 returns 0.6578862349718622
Got 0.64534 returns 0.8690478424766472
Got 0.04175 returns 0.41617107157789923
Data frame:
A values B values
0 0.460050 0.657886
1 0.645342 0.869048
2 0.041752 0.416171
Однако, если яcall array_or_float(True)
, т.е. я хочу получить массивы, тогда, кажется, есть "потерянный" вызов, который даже не применяется к фрейму данных, а именно к первому.
Got 0.88822 returns [[0.31850227]
[0.66878704]]
Got 0.88822 returns [[0.70890116]
[0.9087984 ]]
Got 0.51507 returns [[0.92748729]
[0.98650649]]
Got 0.91706 returns [[0.82387122]
[0.86967768]]
Data frame:
A values B values
0 0.888216 [[0.7089011570815329], [0.9087983994394716]]
1 0.515068 [[0.92748728847228], [0.9865064881611074]]
2 0.917061 [[0.8238712182074142], [0.8696776790080818]]]
Мои спецификации следующие:
- Python 3.6.8
- NumPy 1.15.4
- панды 0.24.0
Что происходит?