假设我有一个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。
8条答案
按热度按时间kuuvgm7e1#
我不相信
apply
可以访问索引;它将每一行都视为一个numpy对象,而不是一个Series,正如你所看到的:要绕过此限制,请将索引提升到列,应用您的函数,并使用原始索引重新创建Series。
其他方法可能使用
s.get_level_values
,在我看来,它通常会变得有点难看,或者s.iterrows()
,它可能会更慢--也许具体取决于f
做什么。vfh0ocws2#
将其设置为帧,如果需要,可以返回标量(因此结果是一个序列)
设置
打印功能
由于您可以在这里返回任何内容,只需返回标量(通过
name
属性访问索引)e3bfsja23#
转换为
DataFrame
并沿沿着行应用。您可以使用x.name
访问索引。x
现在也是一个值为1的Series
ldfqzlk84#
你可能会发现在这里使用
where
比apply
更快:你也可以对任何部分使用numpy风格的逻辑/函数:
apply
s更可读... *9fkzdhlc5#
如果使用DataFrame.apply()而不是Series.apply(),则可以在函数中将整行作为参数访问。
3vpjnl9f6#
使用
reset_index()
将Series转换为DataFrame,将索引转换为列,然后将函数apply
转换为DataFrame。棘手的部分是知道
reset_index()
如何命名列,所以这里有几个例子。单索引序列
输出量:
多索引序列
这里的概念相同,但您需要以
row['level_*']
的形式访问索引值,因为这是Series.reset_index()
放置它们的位置。输出量:
如果您的系列或索引具有名称,则需要进行相应的调整。
kupeojn67#
Series
实现了items()
方法,该方法允许使用列表解析来Map键(即索引值)和值。给定一个系列:
现在,假设函数
f
接受一个键和一个值:现在我们可以通过使用a来创建一个新的系列:
当然,这并没有利用任何numpy性能优势,但对于某些操作来说,这是有意义的。
wribegjk8#
另一个肮脏的解决方案是使用正则表达式。
首先,重置索引以创建一个嵌套框架。
然后创建一个包含串联列和索引的列,如下所示:只要确保使用在模式识别过程中可以容易分离的分隔符。在我的例子中,我使用'first_wall'和'second_wall'
然后创建函数
然后将其应用于串联序列。
干杯!干杯!