2017-01-23 6 views
1

以下の変数A、B、C、Dの計算方法を教えてください。 パンダでの2日目ですが、計算方法を見つけるのが難しいです。ここでpython pandasデータフレームの合成メトリックの計算方法

は私のデータセットです。

d = [{'city':'new-york', 'code':1111, 'recv':1977.44, 'send':0.0}, 
{'city':'new-york', 'code':2222, 'recv':6758926663.7439995, 'send':0.0}, 
{'city':'new-york', 'code':3333, 'recv':189769.38666666666, 'send':0.0}, 
{'city':'amsterdam', 'code':4444, 'recv':2356311.024, 'send':263030.0906666667}, 
{'city':'amsterdam', 'code':5555, 'recv':959.968, 'send':8.063999999999998}] 

はのは、データフレームを作成してみましょう:

df = pandas.DataFrame(d) 

グループ化が重要であり、データセットは大きいですが、簡単のために、我々は2行を持っています。 「街」と「コード」

In [35]: ixmac = df.groupby(['city','code']).sum().loc[:, ['recv','send']] 

私たちは、データセット内の非常に多くの異なる都市を持って

In [36]: len(set(ixmac.index.get_level_values('city'))) 
Out[36]: 2 

我々はデータセット内の非常に多くの異なるコードを持って

In [37]: len(set(ixmac.index.get_level_values('code'))) 
Out[37]: 5 

我々は非常に多くを持っています特定の都市の異なるコード:

In [39]: len(set(ixmac.loc['new-york'].index.get_level_values('code'))) 
Out[39]: 3 

今、私は割り当て方法http://pandas.pydata.org/pandas-docs/stable/dsintro.html#assigning-new-columns-in-method-chains

ratio_asn = A/B

A = len(set(ixmac.loc['new-york'].index.get_level_values('code'))) 
B = len(set(ixmac.index.get_level_values('code'))) 

ではなく、私はこれが由来すると希望の新しい - ヨーク 'を指定するを使用してixmacデータフレームに列を追加したいと思います対応する行が自動的

ratio_recv = C/D 

CはSTHを閉じています0 しかし、代わりに当該のデータフレームの唯一の「RECV」の数を取っ と「新・ニューヨーク」と「1111」は、対応する行と列から自動的に導出されなければならない、つまり

In [52]: ixmac.query('city==["new-york"] & code==[1111]').loc[:,['recv']] 
Out[52]: 
        recv 
city  code   
new-york 1111 1977.44 

D = ixmac.query('city==["new-york"]').sum().loc['recv'] 

が、代わりに「新・ニューヨーク」を指定する私は、これが対応する行に由来すると

をご希望の目的は、データフレームixmacに2つの余分な行を追加することであるに基づいてration_asnratio_recvと呼ばれ、これらの2列のすべてのセルを計算します上記の例。

A、B、C、Dの計算に助言してもらえますか?

EDIT:これは最終的な結果は以下のようになります方法です。

     recv   send ratio_asn ratio_recv 
city  code        
amsterdam 4444 2.356311e+06 263030.090667 0.4 =2/5 0.00034849062450182164 =2.356311e+06/2.356311e+06 
      5555 9.599680e+02  8.064000 0.4 =2/5 1.4197610070222678e-07 =9.599680e+02/2.356311e+06 
new-york 1111 1.977440e+03  0.000000 0.6 =3/5 2.9245685332491435e-07 =1.977440e+03/2.356311e+06 
      2222 6.758927e+09  0.000000 0.6 =3/5 0.9996230086742471 =6.758927e+09/2.356311e+06 
      3333 1.897694e+05  0.000000 0.6 =3/5 2.8066268297069442e-05 =1.897694e+05/2.356311e+06 

In [8]: total = 2.356311e+06 + 9.599680e+02 + 1.977440e+03 + 6.758927e+09 +1.897694e+05 

In [9]: total 
Out[9]: 2.356311e+06 
+1

ご希望のデータセットを投稿することができますか? – MaxU

+0

@MaxUはそれを調べてくれてありがとう。私は要求された情報で元の質問を編集しました。 – iamsterdam

答えて

1

IIUCあなたは、このようにそれを行うことができます。

In [105]: g = df.groupby('city') 

In [106]: df['ratio_asn'] = g.recv.transform(lambda x: len(x)/len(df)) 

In [107]: df['ratio_recv'] = g.recv.transform(lambda x: x/df.recv.sum()) 

In [108]: df 
Out[108]: 
     city code   recv   send ratio_asn ratio_recv 
0 new-york 1111 1.977440e+03  0.000000  0.6 2.924569e-07 
1 new-york 2222 6.758927e+09  0.000000  0.6 9.996230e-01 
2 new-york 3333 1.897694e+05  0.000000  0.6 2.806627e-05 
3 amsterdam 4444 2.356311e+06 263030.090667  0.4 3.484906e-04 
4 amsterdam 5555 9.599680e+02  8.064000  0.4 1.419761e-07 
+0

ありがとう@MaxU、あなたは正しく理解しています:)それは動作します。私はあなたに私を助けてより包括的にするように頼むかもしれません。複数の指標があればどうなるのでしょうか?言い換えれば、.groupby()にもっと多くの用語があったら? "グループ化は重要ですが、データセットは大きくなりますが、簡単にするために、" city "と" code "という2つの行があります。 – iamsterdam

+0

@NikosSkalis、サンプルデータセットと必要なデータセットが必要ですソリューション... – MaxU

+0

私は、上記の 'df.groupby(['city'、 'code'])。sum()' – iamsterdam

関連する問題