2012-06-23 133 views
9

this R question类似,我想使用Pandas将一个函数应用于Series中的每个项目(或DataFrame中的每一行),但希望将此函数的参数用作索引或ID那一排。作为一个简单的例子,假设我们想创建一个形式为[(index_i,value_i),...,(index_n,value_n)]的元组列表。用一个简单的Python for循环,我可以这样做: 熊猫行特定适用

In [1] L = [] 
In [2] s = Series(['six', 'seven', 'six', 'seven', 'six'], 
      index=['a', 'b', 'c', 'd', 'e']) 
In [3] for i, item in enumerate(s): 
      L.append((i,item)) 
In [4] L 
Out[4] [(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

但一定要做到这一点更有效的方式?也许更多的Panda-ish像Series.apply?实际上,我并不担心(在这种情况下)返回任何有意义的东西,而更多的是为了“应用”之类的效率。有任何想法吗?

回答

7

如果对函数使用apply方法,系列中的每个项目都会映射到这样的函数。例如。

>>> s.apply(enumerate) 
a <enumerate object at 0x13cf910> 
b <enumerate object at 0x13cf870> 
c <enumerate object at 0x13cf820> 
d <enumerate object at 0x13cf7d0> 
e <enumerate object at 0x13ecdc0> 

你想要做的只是枚举系列本身。

>>> list(enumerate(s)) 
[(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

如果您想要将所有实体的字符串求和?

>>> ",".join(s) 
'six,seven,six,seven,six' 

适用的更复杂的用法是这样:

>>> from functools import partial 
>>> s.apply(partial(map, lambda x: x*2)) 
a    ['ss', 'ii', 'xx'] 
b ['ss', 'ee', 'vv', 'ee', 'nn'] 
c    ['ss', 'ii', 'xx'] 
d ['ss', 'ee', 'vv', 'ee', 'nn'] 
e    ['ss', 'ii', 'xx'] 

[编辑]

继清问题的任择议定书的问题:与不要混淆系列(1D) DataFrames(2D)http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe - 我真的不知道如何谈论行。然而,你可以通过创建一个新的系列包括在功能指标(应用不会给大家介绍一下目前指数的任何信息):

>>> Series([s[x]+" my index is: "+x for x in s.keys()], index=s.keys()) 
a  six index a 
b seven index b 
c  six index c 
d seven index d 
e  six index e 

无论如何,我会建议您切换到其他数据类型,以避免巨大的内存泄漏。

+0

谢谢@ luke14free关于枚举的指针。最后,我可能提供了一个过于简单化的例子,但你确实提供了一个合适的答案。我真正想要的是,就像你的第三个例子,增加的条件,说,指数是行或索引的函数... –

+0

嘿@CarsonFarmer - 看我最后编辑 – luke14free

+0

谢谢@ luke14free。最后,我按你的建议做了,并通过重组我的数据以不同的方式解决了我的问题。 –

3

这里有一个整洁的方式,使用itertools的countzip

import pandas as pd 
from itertools import count 

s = pd.Series(['six', 'seven', 'six', 'seven', 'six'], 
        index=['a', 'b', 'c', 'd', 'e']) 

In [4]: zip(count(), s) 
Out[4]: [(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

不幸的是,仅作为效率比enumerate(list(s))