2016-07-19 25 views
1

私がどのように見えるデータフレームがあります。条件付き集約パンダDATAFRAME

import pandas as pd 

df = pd.DataFrame([[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], 
        [9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0], 
        [17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0]], 
        columns=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) 

     A  B  C  D  E  F  G  H 
0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 
1 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 
2 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 

そして、私は列のリストを持っている:私のリストの各要素について

l = ['A', 'C', 'D', 'E'] 

を、私は平均値を取得したいですそれより前のデータフレーム列にはそれ自身の列の値の2倍を加えたものです。だから、Aだけ自体に依存し、CAに依存しており、それ自体、Dは、Aの合計に依存C、それ自体、およびEACD、それ自体に依存しますしますします。私は次のように必要なものを達成しています

for i, col in enumerate(l): 
    other_cols = l[:i] 
    df['tmp_' + col] = df[other_cols].mean(axis=1) + 2.0 * df[col] 

     A  B  C  D  E  F  G  H tmp_A tmp_C tmp_D \ 
0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 NaN 7.0 10.0 
1 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 NaN 31.0 34.0 
2 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 NaN 55.0 58.0 

     tmp_E 
0 12.666667 
1 36.666667 
2 60.666667 

むしろためのループを介して実行するよりも、同じことを達成するために、よりPython的な方法があった場合、私は不思議でしたか?

+1

それは 'sum'か' mean'ですか?あなたの質問では、あなたのコードの列の合計がそれは意味ですか?また、なぜtmp_AはNaNですか? – Psidom

+0

はい、それは意味するべきです – slaw

+0

私は 'tmp_A'が' df ["A"] 'の2回であるが、あなたのコードはNaNを生成するとあなたのテキストから推測しました。ちょうど明確にするために、それはあなたが欲しいものですか? – DSM

答えて

1

IIUC、あなたはこれを処理するために近代的なパンダにexpandingを使用することができます。

>>> cols = ["A","C","D","E"] 
>>> df[cols] * 2 + df[cols].expanding(axis=1).mean().shift(axis=1).fillna(0) 

     A  C  D   E 
0 2.0 7.0 10.0 12.666667 
1 18.0 31.0 34.0 36.666667 
2 34.0 55.0 58.0 60.666667 

これはあなたの期待に新しい列を再生する(とfillnaのおかげで0にNaNを回し、二回元の値になっています) 。


これは一歩一歩どこから来た私たちは見ることができます:

>>> df[cols] 

     A  C  D  E 
0 1.0 3.0 4.0 5.0 
1 9.0 11.0 12.0 13.0 
2 17.0 19.0 20.0 21.0 

>>> df[cols].expanding(axis=1) 
Expanding [min_periods=1,center=False,axis=1] 

から始まって、それは視覚的にチェックする方が簡単ですので、私たちは、最初のsumを行うことができます。

>>> df[cols].expanding(axis=1).sum() 

     A  C  D  E 
0 1.0 4.0 8.0 12.0 
1 9.0 20.0 32.0 36.0 
2 17.0 36.0 56.0 60.0 

>>> df[cols].expanding(axis=1).mean() 

     A  C   D  E 
0 1.0 2.0 2.666667 4.0 
1 9.0 10.0 10.666667 12.0 
2 17.0 18.0 18.666667 20.0 

>>> df[cols].expanding(axis=1).mean().shift(axis=1) 

    A  C  D   E 
0 NaN 1.0 2.0 2.666667 
1 NaN 9.0 10.0 10.666667 
2 NaN 17.0 18.0 18.666667 

>>> df[cols].expanding(axis=1).mean().shift(axis=1).fillna(0) 

    A  C  D   E 
0 0.0 1.0 2.0 2.666667 
1 0.0 9.0 10.0 10.666667 
2 0.0 17.0 18.0 18.666667 
+0

これは有益で教育的な回答でした。 'Expanding'関数は私には新しく、例を見ることなくドキュメントだけから理解できるとは思っていませんでした。 – slaw

+0

'df [cols] .expanding(axis = 1).sum()'では、最後の列である 'E'の値がどうして間違っていますか? 13、45、77でなければならない? – slaw

+0

また、データフレームに値の行が1つしかない場合(つまり、 'df = pd.DataFrame([[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]]、 – slaw