2017-03-24 10 views
2

私は初めてパンダを扱っています。私は集約に関していくつか問題があります。私はこのような適用の文で追加された3つの計算フィールドを持つデータフレームを持っている:pandasでヌル値のブール値フィールドを集計するにはどうすればよいですか?

dataset['calculated_field'] = dataset.apply(
    lambda row: calculation_function(
     row['field1'], 
     row['field2'] 
    ), 
    axis = 1 
) 

計算フィールドはブール値ですが、キャッチと。それらはヌル値を含むことができます。

ブール値の列の平均を探していますが、その平均値はその列のnullフィールドを無視しています。私はこのような何か試してみた

resultset = dataset.groupby(['grouping_field'])[['calculated_field','calculated_field_2','calculated_field_3']].mean() 

を問題は、パンダが完全に“nuisance” column.として列をドロップし、真/偽/なしブールので、「オブジェクト」タイプであるということです。

それは私も長いルートを試してみましたが、各集計のために3つの別々のデータフレームを作成し

「偽」null値になりますので、私は、しかし、ブール値に列を変換することはできませんので、私はドロップでき

(凝集させることができる)NULL値とBOOLに変換:

dataset_for_field1 = dataset.dropna(subset = ['calculated_field']).copy() 
dataset_for_field1['calculated_field'] = dataset_for_field1['calculated_field'].astype('bool') 

result_for_field1 = dataset_for_field1.groupby(['grouping_field'])['calculated_field'].mean() 
これは私に私が探しているデータを与える

が、3つの別々のデータフレームインチ

ヌルを無視して、各列の平均で1つのデータフレームを取得する方法はありますか?

答えて

1

数字の列に変換します。 Noneは、NaNとなり、True1となり、Falsesは0となる。データフレーム全体を変換する便利な方法は、のerrorsパラメータをignoreに設定して使用することです。移動するとエラーになるので、グループ化の列はそのままになります。

これは、その後のgroupbyでこれを使用して

df.apply(pd.to_numeric, errors='ignore') 

    clc1 clc2 clc3 clc4 gcol 
0 1.0 True True 0.0 a 
1 0.0 False True NaN a 
2 1.0 True True NaN a 
3 NaN False True 1.0 a 
4 1.0 True True 0.0 b 
5 0.0 False True NaN b 
6 1.0 True True NaN b 
7 NaN False True 1.0 b 

ような数値ルックスに変換すると、何をしたいあなたを得るべきであるdf

df = pd.DataFrame(dict(
     gcol=list('aaaabbbb'), 
     clc1=[True, False, True, None] * 2, 
     clc2=[True, False, True, False] * 2, 
     clc3=[True, True, True, True] * 2, 
     clc4=[False, None, None, True]* 2 
    )) 

データフレームを考えてみましょう。

df.apply(pd.to_numeric, errors='ignore').groupby('gcol').mean() 

      clc1 clc2 clc3 clc4 
gcol        
a  0.666667 0.5 1.0 0.5 
b  0.666667 0.5 1.0 0.5 
+0

数値変換はまさに必要なものでした。ご協力ありがとうございました! – jwaltzjr

関連する問題