python pandas DataFrame.apply: возвращать серию вместо dataframe - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь применить функцию к DataFrame по строке (ось = 1), и когда примененная функция возвращает серию, окончательное возвращаемое значение 'apply' будет кадром данных, а не тем, что яхочу.Я нашел похожую проблему здесь, Возвращение нескольких значений из панд применяется к DataFrame , однако в данном случае речь идет о применении функции к групповому.и в случае не группы, будет возвращен фрейм данных, даже если возвращенная серия примененной функции имеет разную длину.

In [10]: import pandas as pd

In [11]: import numpy as np

In [12]: df = pd.DataFrame({'start': [1, 2, 3], 'end': [7, 9, 9]})

In [13]: df
Out[13]:
   end  start
0    7      1
1    9      2
2    9      3

In [14]: def fun(df):
    ...:     return pd.Series(np.arange(df['start'], df['end'], 1))
    ...:

In [15]: df.apply(fun, axis=1)
Out[15]:
     0    1    2    3    4    5    6
0  1.0  2.0  3.0  4.0  5.0  6.0  NaN
1  2.0  3.0  4.0  5.0  6.0  7.0  8.0
2  3.0  4.0  5.0  6.0  7.0  8.0  NaN

однако, что я хочу, это что-то вроде этого (иерархическая серия):

Out[23]:
0  0    1.0
   1    2.0
   2    3.0
   3    4.0
   4    5.0
   5    6.0
1  0    2.0
   1    3.0
   2    4.0
   3    5.0
   4    6.0
   5    7.0
   6    8.0
2  0    3.0
   1    4.0
   2    5.0
   3    6.0
   4    7.0
   5    8.0
dtype: float64

1 Ответ

0 голосов
/ 13 июня 2018

Здесь apply преобразовать значения в DataFrame, чтобы быть проектным, поэтому возможны решения stack:

s = df.apply(fun, axis=1).stack()
print (s)
0  0    1.0
   1    2.0
   2    3.0
   3    4.0
   4    5.0
   5    6.0
1  0    2.0
   1    3.0
   2    4.0
   3    5.0
   4    6.0
   5    7.0
   6    8.0
2  0    3.0
   1    4.0
   2    5.0
   3    6.0
   4    7.0
   5    8.0
dtype: float64

или list comprehension с concat:

L = [pd.Series(np.arange(a, b)) for a, b in zip(df['start'], df['end'])]
s = pd.concat(L, keys=df.index)
print (s)
0  0    1
   1    2
   2    3
   3    4
   4    5
   5    6
1  0    2
   1    3
   2    4
   3    5
   4    6
   5    7
   6    8
2  0    3
   1    4
   2    5
   3    6
   4    7
   5    8
dtype: int32
...