2017-01-27 6 views
2

私はPythonとデータフレームを扱うのが初めてです。私は以下のような形式のデータフレームを持っています。別の列の値に基づいて同じ列に行を分割する

TYPE | FLAG | PROP 
---- | ---- | ---- 
A | 0 | 0.1 
B | 0 | 0.2 
C | 0 | 0.5 
D | 0 | 0.2 
A | 1 | 0.15 
B | 1 | 0.4 
C | 1 | 0.3 
D | 1 | 0.15 

TYPEのインデックスの新しいデータフレームを作成したいとします。 (FLAGためPROPによるFLAGのためのすなわち分割PROP = 1 = 0)

理想的には、私は(私はそれが助け場合の計算を残してきた)で終わるしたい:

TYPE | INDEX 
---- | ---- 
A | 1.5 (= 0.15/0.1) 
B | 2 (=0.4/0.2) 
C | 0.6 (=0.3/0.5)  
D | 0.75 (=0.15/0.2) 

私がした場合私はおそらくこのようなものを書くでしょう。

select type, 
one_prop/zero_prop as index 
from (
select account_type 
, max(case when index=1 then prop else 0 end) as prop_A 
, max(case when index=0 then prop else 0 end) as prop_B 
from table 
) a 

ご協力いただければ幸いです。私は感じているdf.groupby()ここで私を助けるつもりですが、私は完全にはどのようには分かりません。

これは私の問題を単純化したものであり、ソリューションにはあまり影響しないとは思っていませんが、私が興味を持っていない他の列があり、計算を考慮しません。

+0

FLAGとTYPEによって行が重複していますか? – jezrael

+0

いいえ、そうではありません。 TYPE&FLAGの各値の組み合わせは1つだけです。 – tfcoe

答えて

1

あなたがリシェイプためunstackset_indexを使用して、divで割ることができます:pivot

df = df.set_index(['TYPE','FLAG'])['PROP'].unstack() 
df['INDEX'] = df[1].div(df[0]) 
#drop columns, reset index and remove column name 
df = df.drop([0,1], axis=1).reset_index().rename_axis(None, axis=1) 
print (df) 
    TYPE INDEX 
0 A 1.50 
1 B 2.00 
2 C 0.60 
3 D 0.75 

別の解決策:DataFrameコンストラクタと

df = df.pivot(index='TYPE', columns='FLAG', values='PROP') 
df['INDEX'] = df[1].div(df[0]) 
df = df.drop([0,1], axis=1).reset_index().rename_axis(None, axis=1) 
print (df) 
    TYPE INDEX 
0 A 1.50 
1 B 2.00 
2 C 0.60 
3 D 0.75 

ソリューション:

df = df.pivot(index='TYPE', columns='FLAG', values='PROP') 
a = df[1].div(df[0]) 
df = pd.DataFrame({'TYPE':a.index,'INDEX':a.values}, columns=['TYPE','INDEX']) 
print (df) 
    TYPE INDEX 
0 A 1.50 
1 B 2.00 
2 C 0.60 
3 D 0.75 
0

あなたは基本的に一つに二つの等しいサイズと等しいインデックスデータフレームを持っているとして、あなただけのFLAGに対してバック2つのビューでそれらを分割して計算を行うことができます。

df.set_index('TYPE', inplace=True) 

df 
Out[17]: 
     FLAG PROP 
TYPE    
A  0 0.10 
B  0 0.20 
C  0 0.50 
D  0 0.20 
A  1 0.15 
B  1 0.40 
C  1 0.30 
D  1 0.15 

df[df.FLAG==1]['PROP']/df[df.FLAG==0]['PROP'] 
Out[18]: 
TYPE 
A 1.50 
B 2.00 
C 0.60 
D 0.75 
Name: PROP, dtype: float64 
関連する問題