2017-01-15 9 views
0

私は高度なGROUPBY列の作成DATAFRAME

  • グループID('CG'、int型)で主に構成されていDATAFRAME、'compact'、中銀河のグループのカタログ、
  • 大きさ('R'を持っています、負の浮動小数点)
  • および形態('Morph'、文字列、たとえば 'S'または 'E')。

Iは、グループの次の特性を有する第二パンダのデータフレームを構築しようとしている:第二最低間の最小'R'

  • グループ差を有する物体の

    • 'Morph'とグループ内の最も低い'R'
    • グループ内の最も低い'R'とグループのRとの差は、-2.5*log10(sum(10**(-0.4*R)))
    • と定義されます210
    • グループ内にある'Morph'(「S」の列に、他のモフォロジーに1つなど)を持つオブジェクトの割合。'R'が最も小さいものをカウントしません。

    私は最後の問題に苦しんでいます。それを書くのを手伝ってもらえますか?他のものはうまくいきますが、二次的な質問として、私がそれを清潔にしているのか、そうするのが良いのかと思います。ここで

    は私の(私が欲しいものを正確に与えるものではありませんが、働く私の最後の列の行で、かつ動作しないコメントでTRY)コードです:

    GroupBy = compact.sort_values('R').groupby('CG', as_index=False) 
    R2 = GroupBy.head(2).groupby('CG', as_index=False).last().R 
    R1 = GroupBy.first().sort_values('CG').R 
    DeltaR12 = R2 - R1 
    MorphCen = GroupBy.first().sort_values('CG').Morph 
    Group = GroupBy.first().sort_values('CG').CG 
    RGroup = GroupBy.apply(lambda x: -2.5*np.log10((10**(-0.4*x.R)).sum())) 
    DeltaR1gr = R1 - RGroup 
    
    
    # Works, but counts the object with lowest R: 
    PropS = GroupBy.apply(lambda x: 1.0*x.loc[x['Morph'] == 'S'].shape[0]/x.shape[0]) 
    # Tries to let aside lowest R, but doesn't work: 
    # PropS = GroupBy.apply(lambda x: 1.0*x.loc[x['Morph'] == 'S' & 
    #      x['R']>x['R'].min()].shape[0]/x.shape[0]) 
    
    # PropRed = same than PropS, but for 'Morph' != 'S' 
    
    CompactML = pd.DataFrame([Group,MorphCen,DeltaR12,DeltaR1gr]).transpose() 
    CompactML.columns = ['CG', 'MorphCen', 'DeltaR12','DeltaR1gr'] 
    

    答えて

    2

    まず、そのあなたが実際のデータを提供したり、偽のデータを作成したりするといいですね。以下では、5つの異なる整数CGグループ、2つのタイプの形態(SとE)、および 'R'のランダムな負の数でいくつかの偽のデータを作成しました。

    私は4つの戻り集計をそれぞれ1行で計算し、各出力を元のDataFrameに行として追加するシリーズとして結果を返すカスタム関数ですべての集計をやり直しました。

    #create fake data 
    df = pd.DataFrame({'CG':np.random.randint(0, 5, 100), 'Morph':np.random.choice(['S', 'E'], 100), 'R':np.random.rand(100) * -100}) 
    print(df.head()) 
    
        CG Morph   R 
    0 3  E -72.377887 
    1 2  E -26.126565 
    2 0  E -4.428494 
    3 0  E -2.055434 
    4 4  E -93.341489 
    
    # define custom aggregation function 
    def my_agg(x): 
        x = x.sort_values('R') 
        morph = x.head(1)['Morph'].values[0] 
        diff = x.iloc[0]['R'] - x.iloc[1]['R'] 
        diff2 = -2.5*np.log10(sum(10**(-0.4*x['R']))) 
        prop = (x['Morph'].iloc[1:] == 'S').mean() 
        return pd.Series([morph, diff, diff2, prop], index=['morph', 'diff', 'diff2', 'prop']) 
    
    # apply custom agg function 
    df.groupby('CG').apply(my_agg) 
    
        morph  diff  diff2  prop 
    CG          
    0  E -1.562630 -97.676934 0.555556 
    1  S -3.228845 -98.398337 0.391304 
    2  S -6.537937 -91.092164 0.307692 
    3  E -0.023813 -99.919336 0.500000 
    4  E -11.943842 -99.815734 0.705882 
    
    +0

    は、私はそれがどのように動作するかを理解し、ありがとうございました! :)模擬データを申し訳ありません、私はそれを次回提供します。 – Matt

    +0

    コードの大部分が正常に動作します。私のためだけでなく、あなたの例でも 'diff'だけが間違っています。私は何が起こっているのか把握しようとしています。再度、感謝します! – Matt

    +0

    OK、そうです。私は適切なコードを掲示し、私はあなたの答えを受け入れる。再度、感謝します! – Matt

    0

    だから、ここ最終的なコードは、Ted Pertouのおかげである:

    # define custom aggregation function 
    def my_agg(x): 
        x = x.sort_values('R') 
        morph = x.head(1)['Morph'].values[0] 
        diff = x.iloc[1]['R'] - x.iloc[0]['R'] 
        diff2 = x.iloc[0]['R'] + 2.5*np.log10(sum(10**(-0.4*x['R']))) 
        prop = (x['Morph'].iloc[1:] == 'S').mean() 
        return pd.Series([morph, diff, diff2, prop], index=['MorphCen', 'DeltaR12', 'DeltaRGrp1', 'PropS']) 
    
    # apply custom agg function 
    compact.groupby('CG').apply(my_agg) 
    
    関連する問題