簡體   English   中英

大熊貓行具體適用

[英]pandas row specific apply

此R問題類似,我想使用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-likeh喜歡Series.apply? 實際上,我並不擔心(在這種情況下)返回任何有意義的東西,但更多的是為了“應用”之類的效率。 有任何想法嗎?

如果對函數使用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']

[編輯]

根據OP的澄清問題:不要將系列(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

無論如何,我建議你切換到其他數據類型,以避免巨大的內存泄漏。

這是一個簡潔的方法,使用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))才有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM