假设我有一个MultiIndex系列s
>>> s
values
a b
1 2 0.1
3 6 0.3
4 4 0.7我想应用一个函数,它使用行的索引:
def f(x):
# conditions or computations using the indexes
if x.index[0] and ...:
other = sum(x.index) + ...
return something对于这样的函数,我如何做s.apply(f)呢?做这种操作的推荐方法是什么?我希望获得一个新的Series,其中包含在每一行和同一个MultiIndex上应用的函数所产生的值。
发布于 2013-08-19 14:52:38
我认为apply没有访问索引的权限;它将每一行视为一个numpy对象,而不是一个Series,如您所见:
In [27]: s.apply(lambda x: type(x))
Out[27]:
a b
1 2 <type 'numpy.float64'>
3 6 <type 'numpy.float64'>
4 4 <type 'numpy.float64'>要克服这一限制,请将索引提升到列,应用您的函数,并使用原始索引重新创建一个Series。
Series(s.reset_index().apply(f, axis=1).values, index=s.index)其他方法可能使用s.get_level_values (在我看来常常有点难看),或者使用s.iterrows(),后者可能会慢一些--可能取决于f到底做了什么。
发布于 2013-08-19 15:04:10
让它成为一个框架,如果你想要返回标量(所以结果是一个系列)
设置
In [11]: s = Series([1,2,3],dtype='float64',index=['a','b','c'])
In [12]: s
Out[12]:
a 1
b 2
c 3
dtype: float64打印功能
In [13]: def f(x):
print type(x), x
return x
....:
In [14]: pd.DataFrame(s).apply(f)
<class 'pandas.core.series.Series'> a 1
b 2
c 3
Name: 0, dtype: float64
<class 'pandas.core.series.Series'> a 1
b 2
c 3
Name: 0, dtype: float64
Out[14]:
0
a 1
b 2
c 3由于您可以在这里返回任何内容,所以只需返回标量(通过name属性访问索引)
In [15]: pd.DataFrame(s).apply(lambda x: 5 if x.name == 'a' else x[0] ,1)
Out[15]:
a 5
b 2
c 3
dtype: float64发布于 2017-12-05 03:54:31
转换为DataFrame并沿行应用。您可以以x.name的形式访问索引。x现在也是一个具有1值的Series
s.to_frame(0).apply(f, axis=1)[0]https://stackoverflow.com/questions/18316211
复制相似问题