2017-02-18 6 views
1

パンダ列のバイナリ文字列の各桁のモード値を調べたいと思います。我々は最初の数字(0、1、1)Aの、Bでカラム "値" を検討している場合ので、私のデータは、このパンダ列のバイナリ列の各桁のモード

categories values 
A    001 
B    110 
C    111 

のように見える、私は次のようなデータ

df = pd.DataFrame({'categories':['A','B','C'],'values':['001','110','111']}) 

があるとし、私は他の桁で同じことを行う場合、私の期待される出力は111になるはずです。

私は特定の列のモード値を見つけることができます。私は各ビットを新しい列に分割し、モード値を見つける。私は後で連結によって期待される出力を得ることができた。しかし、データにバイナリ文字列の列がはるかに多い場合、この方法が依然として有効な方法かどうかはわかりません。私はこれをよりエレガントな方法を探しています。あなたの提案がありますか?

答えて

2

私はあなたが列に変換digitsためSerieslistapplyを使用して、modeことができると思います。

print (df['values'].apply(lambda x: pd.Series(list(x)))) 
    0 1 2 
0 0 0 1 
1 1 1 0 
2 1 1 1 

df1 = df['values'].apply(lambda x: pd.Series(list(x))).mode() 
print (df1) 
    0 1 2 
0 1 1 1 

最終行選択、listjoinを作成します。

print (''.join(df1.iloc[0].tolist())) 
111 

のもう一つの可能​​な解決策をlist comprehension

df = pd.DataFrame([list(x) for x in df['values']]) 
print (df) 
    0 1 2 
0 0 0 1 
1 1 1 0 
2 1 1 1 

出力はDataFrameであれば可能な用途は、applyjoin次のとおりです。

df = pd.DataFrame({'categories':['A','B','C', 'D'],'values':['001','110','111', '000']}) 
print (df) 
    categories values 
0   A 001 
1   B 110 
2   C 111 
3   D 000 

print (pd.DataFrame([list(x) for x in df['values']]).mode()) 
    0 1 2 
0 0 0 0 
1 1 1 1 

df1 = pd.DataFrame([list(x) for x in df['values']]).mode().apply(''.join, axis=1) 
print (df1) 
0 000 
1 111 
dtype: object 
関連する問題