2016-06-24 3 views
2

で私はこのようになりますパンダのDATAFRAMEあります使用パンダDATAFRAME /パネル.apply()一緒にインデックス/カラム情報

  2016  2017  2018  2019  2020 
1 0.014199 0.020776 0.016393 0.010112 0.013346 
2 0.025220 0.024088 0.035357 0.026878 0.031841 
3 0.016345 0.014117 0.017157 0.019280 0.017307 
4 0.021467 0.020389 0.027269 0.027727 0.025750 
5 0.012459 0.004377 0.015435 0.023725 0.031228 

そして、このようになります機能:

def f(a,b): 
    return a+b 

を私は、高速である(つまり、ループを回避する)ために、aがエントリであり、bというカラム名(またはそれが動作する場合はインデックス)を持つデータフレームのすべての要素に対してfを計算する方法を探しています。

出力は次のようになります。

2016    2017 
1 2016.014199  2017.020776 ... 
2 2016.025220  2017.024088 ... 

私は.apply()の機能をしようとしているが、それを動作させる方法を発見していません。何かヒントはありますか?

KR、リチャード

+0

おかげで、。他の操作(乗算や力の奪取など)を試してみましょう。 –

答えて

3

これを試してみてください。

In [138]: df.apply(lambda x: int(x.name) + x) 
Out[138]: 
      2016   2017   2018   2019   2020 
1 2016.014199 2017.020776 2018.016393 2019.010112 2020.013346 
2 2016.025220 2017.024088 2018.035357 2019.026878 2020.031841 
3 2016.016345 2017.014117 2018.017157 2019.019280 2020.017307 
4 2016.021467 2017.020389 2018.027269 2019.027727 2020.025750 
5 2016.012459 2017.004377 2018.015435 2019.023725 2020.031228 

注:お使いの列名があなたとaddを使用することができ整数であると仮定すると、

In [150]: df = pd.concat([df] * 10**5, ignore_index=False) 

In [151]: df.shape 
Out[151]: (500000, 5) 

In [152]: %timeit df.apply(lambda x: int(x.name) + x) 
10 loops, best of 3: 40.7 ms per loop 

In [153]: %timeit df.add(df.columns.map(int)) 
100 loops, best of 3: 7.95 ms per loop 
3

:ルートのソリューションは、はるかに高速です@列の値:

df = df.add(df.columns.values) 

列名が文字列である場合は、addを使用する際に整数に列名を変換するmapを使用します。私が探していただけで何

df = df.add(df.columns.map(int)) 
+0

私はあなたのソリューションが私のものよりも好きです。 ;) 'df.add(df.columns.map(int))' - これは文字列でも動作します – MaxU

+0

ありがとう!私はちょうど 'マップ'をテストしていたが、あなたはあなたのコメントでそれに私を打つ。それから私はタイミングをとろうとしていましたが、あなたは私にもそれを打ち負かしました! – root

関連する問題