2012-06-23 29 views
9

this R question'a benzer, Panda'ları kullanarak bir Dizideki (veya bir DataFrame'deki her satırdaki) her öğeye bir işlev uygulamak istiyorum, ancak bu işleve indis veya kimlik için bir argüman olarak kullanmak istiyorum Bu satırın Önemsiz bir örnek olarak, [[index_i, value_i], ..., (index_n, value_n)] formunun bir tuples listesi oluşturmak istediğini varsayalım. pandalar satırına özel uygulayın

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')] 

Ama bunu yapmak için daha etkili bir yolu olmalı: döngü için basit Python kullanarak, yapabilirim? Belki de daha fazla Panda-ish Series.apply gibi bir şey? Gerçekte, (bu durumda) anlamlı bir şey döndürmekten endişe duymuyorum, ama daha çok 'başvurma' gibi bir şeyin verimliliği için. Herhangi bir fikir?

cevap

7

Uygula yöntemini bir işlevle kullanırsanız ne olur, Seri'deki her öğenin böyle bir işlevle eşleştirilmesi gerekir. Örneğin.

>>> 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> 

Yapmak istediğiniz şey dizinin kendisini sıralamaktır.

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

Örneğin, tüm varlıkların dizisini toplamak istediğinizde ne olur? Seri (1D) karıştırmayın ile: açıklamalar için OP'ın sorusuna ardından

>>> 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'] 

[Düzenle]

:

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

uygulamak ilişkin daha karmaşık kullanım bu bir olurdu DataFrames (2D) http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe - gerçekten satırlar hakkında nasıl konuşabileceğinizi görmüyorum.

>>> 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 

neyse sana kocaman bellek sızıntılarını önlemek için diğer veri türlerine geçiş öneririm: Eğer yeni bir dizi oluşturarak işlevinde indeksleri içerebilir Ancak (alışkanlık aktüel endeksi hakkında herhangi bir bilgi vermek geçerlidir).

+0

Sayfanın enumerate üzerindeki işaretçisi için luke14free. Sonunda, muhtemelen çok basit bir örnek verdim, ama gerçekten uygun bir cevap verdiniz. Yine de gerçekten istediğim şey, üçüncü örneğiniz gibi bir şeydir, söylenen ek koşulla, üsün satır veya dizinin bir işlevidir ... –

+0

Hey @CarsonFarmer - son düzenlemeye bakın – luke14free

+0

Teşekkürler @ luke14free. Sonunda önerdiğin gibi yaptım ve verilerimi yeniden yapılandırarak meselemi farklı bir şekilde çözmeye çalıştım. –

3

İşte itertools en count ve zip kullanarak, temiz bir yoludur:

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')] 

Maalesef sadece verimli daha enumerate(list(s))!