繁体   English   中英

python pandas DataFrame.apply:返回系列而不是数据框

[英]python pandas DataFrame.apply: return a series instead of a dataframe

我正在尝试将一个函数应用于行(轴= 1)的DataFrame上,并且当所应用的函数返回一个系列时,“ apply”的最终返回值将是一个数据帧,这不是我想要的。 我在这里发现了类似的问题, 从pandas返回多个值适用于DataFrame ,但是这种情况是将功能应用于groupby。 在非分组的情况下,即使返回的一系列应用函数的长度不同,也将返回一个数据帧。

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

这里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

或使用concat list comprehension

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM