[英]Pandas Dataframe.apply return Dataframe instead of Series
[英]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.