2017-09-11 17 views
1

を選ぶ集計行は、私がこのようなデータフレームを持っている:Pythonのパンダ:条件値が

df = pd.DataFrame({'dim': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A'}, 
        'id': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3}, 
        'value1': {0: nan, 1: 1.2, 2: 2.0, 3: nan, 4: 3.0}, 
        'value2': {0: 1.0, 1: 2.0, 2: nan, 3: nan, 4: nan}}) 

    dim id value1 value2 
0 A 1  NaN  1.0 
1 B 1  1.2  2.0 
2 A 2  2.0  NaN 
3 B 2  NaN  NaN 
4 A 3  3.0  NaN 

次が真であるように、私は今、ID以上の異なる寸法の値を集計したい: 薄暗い場合= = 'A'はNoneではなく、dim == 'A'の値をとり、dim == 'B'の場合は値をとります(Noneでない場合)。両方がNoneの場合、Noneを取るだけです。

だから、結果は次のようになります。

id value1 value2 
0 1  1.2  1.0 
1 2  2.0  NaN 
2 3  3.0  NaN 

私の推測ではある、私は機能することにより、グループのいくつかのフォームを使用する必要があるだろうが、私はあまりにもわかりません。おそらく適用と何か?

答えて

4

あなたはその後、combine_firstunstackswaplevelリシェイプ用とでset_indexを使用することができます。xs

df1 = df.set_index(['id','dim']).unstack().swaplevel(0,1,axis=1) 
#alternative 
#df1 = df.pivot('id','dim').swaplevel(0,1,axis=1) 
print (df1) 
dim  A  B  A  B 
    value1 value1 value2 value2 
id        
1  NaN 1.2 1.0 2.0 
2  2.0 NaN NaN NaN 
3  3.0 NaN NaN NaN 

df2 = df1['A'].combine_first(df1['B']).reset_index() 
print (df2) 
    id value1 value2 
0 1  1.2  1.0 
1 2  2.0  NaN 
2 3  3.0  NaN 

同様のソリューションを選択MultiIndexため:

df1 = df.set_index(['id','dim']).unstack() 
#alternative 
#df1 = df.pivot('id','dim') 
print (df1) 
    value1  value2  
dim  A B  A B 
id       
1  NaN 1.2 1.0 2.0 
2  2.0 NaN NaN NaN 
3  3.0 NaN NaN NaN 

df2 = df1.xs('A', axis=1, level=1).combine_first(df1.xs('B', axis=1, level=1)).reset_index() 
print (df2) 
    id value1 value2 
0 1  1.2  1.0 
1 2  2.0  NaN 
2 3  3.0  NaN 
+1

うわー。ありがとうございます - それはうまくいきます:-) 複数の列を組み合わせる人は、複数の組み合わせの呼び出しをお互いに使用してください。 –