2012-06-23 130 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))