2017-09-07 11 views
0

ループ・レベル0のインデックスを使用せずにマルチインデックス・データフレーム(基本的にgroupby記述データフレーム)に関数を適用したいと考えています。マルチインデックスのpandas apply関数

私は適用したい

機能:私のデータフレームの

def CI(x): 
    import math 
    sigma = x["std"] 
    n = x["count"] 
    return 1.96 * sigma/math.sqrt(n) 

サンプル:

df = df.iloc[47:52, [3,4,-1]] 

       a   b     id 
47   0.218182 0.000000 0d1974107c6731989c762e96def73568 
48   0.000000 0.000000 0d1974107c6731989c762e96def73568 
49   0.218182 0.130909 0d1974107c6731989c762e96def73568 
50   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 
51   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 

そして、私はナンとゼロを置き換える:IDに

df = df.replace(float(0), np.nan) 

Groupyと説明私はマルチインデックスを取得します:

私は好きではないと思う

現在のソリューションを向上させることができた:私はからZまでのトップレベルの列を持っている場合、だから、再び

        a  b 
id 
06f32e6e45da385834dac983256d59f3 nan  nan 
0d1974107c6731989c762e96def73568 0.005 0.225 
0fd4f3b4adf43682f08e693a905b7432 0.008 nan 
11e0057cdc8b8e1b1cdabfa8a092ea5f 0.018 0.582 
120549af6977623bd01d77135a91a523 0.008 0.204 

l_df = [] 
for column in df_group.columns.levels[0]: 
    df = pd.DataFrame({"CI" : df_group[column].apply(CI, axis = 1)}) 
    l_df.append(df) 
CI = pd.concat(l_df, axis = 1) 
CI.columns = df_group.columns.levels[0] 

ので、私のような何かを得ますそれぞれにstdとcount列が含まれていますが、これらの各列に同時にどのように関数を適用できますか?

+0

サンプルは返事をあなたにジョンをありがとうございます。それはより短い解決策ですが、原則として私の解決策を言い換えるだけです。私は、ループやリスト内包のために、マルチインデックスレベルで動作することができるパンダ内のメソッドがあるかどうかを知りたがっていました。 – LostBoardOnTaurangaBeach

+0

Genius!これは私が探していた答えです。あなたはgroupbyを何度も実行するのが普通だと思っていて、ラムダを再帰的に使う方法を考えてきました。とても有難い!あなたはポイントを報酬することができるように答えを投稿する必要があります(私は報酬のあるシステムを正しく理解している - 私は新しいです) – LostBoardOnTaurangaBeach

+0

答えとして追加しました。 – Zero

答えて

1

groupbylevelとし、axis=1を使用して、最初のレベルの列を反復して適用しましょう。

In [104]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1) 
      .apply(lambda x: x[x.name].apply(CI, axis=1))) 
Out[104]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

Infactはあなたが

In [105]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1).apply(lambda x: x[x.name] 
      .apply(lambda x: 1.96*x['std']/np.sqrt(x['count']), axis=1))) 
Out[105]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

にした場合、あなたは、CIを必要としないdf

In [106]: df 
Out[106]: 
      a   b        id 
47 0.218182  NaN 0d1974107c6731989c762e96def73568 
48  NaN  NaN 0d1974107c6731989c762e96def73568 
49 0.218182 0.130909 0d1974107c6731989c762e96def73568 
50  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
51  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
+0

ありがとうございました。 Jupiterノートブックからコピーしようとしたときにフォーマットがうまくいかず、手作業でかなりの修正を加えなければならなかったので、結果をstackoverflowにどのように出力しているのか聞いてもらえますか? – LostBoardOnTaurangaBeach

+0

https://meta.stackexchange.com/questions/216464/how-to-insert-code-properly-on-stack-overflowおよびhttps://stackoverflow.com/questions/20109391/how-to-make-良い再生可能なパンダの例 – Zero

関連する問題