2017-04-12 7 views
0

私は、各セルを1つずつ変更するループを書く代わりに、パンダのデータフレームの列全体またはサブセクションに関数を適用する方法を理解しました。パンダのデータフレームに関数を適用する

上記を実行する際に、データフレーム内のセルを入力として受け取る関数を記述することは可能ですか?

例:現在のセルで前のセルの値に前のセルの前にセルを掛けた積を返す関数。私はループでこれを1行ずつやっていますが、それは意外にも非常に非効率的です。私はPythonにはかなり新しいです。あなたは(前の2つのセルを掛ける)に言及する場合のために、あなたは(各セルの各列をループではなく、どの)次の操作を行うことができ

+0

にhttp:/ /pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html –

答えて

0

import pandas as pd 

a = pd.DataFrame({0:[1,2,3,4,5],1:[2,3,4,5,6],2:0,3:0}) 

for i in range(2,len(a)): 
    a[i] = a[i-1]*a[i-2] 

これはaで各列を行います前の2つの列があなたが行の代わりに列を下って行くこの操作を実行したい場合は、あなただけのtransposeデータフレーム(その後、元の形式でそれを取り戻すためにループを実行した後に再びそれを移調)することができ、一緒

掛け

EDIT

実際には、2つの列の前の行の要素と2つの列の現在の行の要素の積が求められます。これは、シフトを使用して達成することができます。

import pandas as pd 

df= pd.DataFrame({"A": [1,2,3,4], "B": [1,2,3,4], "C": [2,3,4,5], "D": [5,5,5,5]}) 

df['E'] = df['A'].shift(1)*df['B'].shift(1)*df['C']*df['D'] 

df['E'] 

が生成されます

0  NaN 
1  15.0 
2  80.0 
3 225.0 
+0

私は、(forループを使用せずに)データフレーム内の以前の値を引き出す関数の構文について考えていると思いますが、 。すべての列をいくつかの数で掛けたければ、それほど多くは分かりませんでした。何かアドバイス? – John

+1

私はあなたが望むかもしれないと思うものに基づいて私の答えを編集しました。これがあなたが望むものでない場合は、入力例と希望する出力を使って答えを編集できれば非常に役に立ちます。 – Kewl

+0

私は入力としてこのdfを持っています。 'df = pd.DataFrame({" A ":[1,2,3,4]、" B ":[1,2,3,4]、" C ":[2,3,4,5] ]、 "D":[5,5,5,5]}) 例として、私は各行を通り、列CとDの積を取って、これを前の行のA&最終的な配列は次のようになります。 'df = pd.DataFrame({" A ":[1,2,3,4]、" B ":[ 1,2,3,4]、 "C":[2,3,4,5]、 "D":[5,5,5,5]、 "E":[0,15,80,225]}) ' (Eの最初の値は0に固定されています) 私はforループを使用してこれを行う方法を知っていますが、実際には大きなデータフレームの場合、これらの計算にはしばらく時間がかかります。 – John

0

これは、トリックを行い、シフトはあなたの必要性に応じて、両方の前方と後方に行くことができます。

df['Column'] = df['Column'].shift(1) * df['Column'].shift(2) 
関連する問題