2017-01-23 116 views
1

請問如何計算下面的變量A,B,C,D? 這是我第二天與熊貓,我很難找到計算方法。如何計算python熊貓數據框中的合成度量

這裏是我的數據集:

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 

現在,我想將列添加到數據幀ixmac使用分配方法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'))) 

但我想,而不是指定「新紐約」這個從所導出的對應行自動

ratio_recv = C/D 

C被某物關閉ixmac.query('city==["new-york"] & code==[1111]').loc[:,['recv']] 但考慮只有「的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'] 

但而不是指定「新約克」我想這是從相應的行

的目標是在叫ration_asnratio_recv數據框ixmac添加2個額外的行和計算基礎上,在這2列的每一個細胞衍生上面的例子。

您能否建議/幫忙計算A,B,C,D?

編輯:這是最終的結果應該如何看起來像:

     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()有更多的術語? 「分組很重要,數據集更大,但爲了簡單起見,我們有2行,'城市'和'代碼'」 – iamsterdam

+0

@NikosSkalis,我想我需要一個樣本數據集和所需數據集以便爲您提供解決方案... – MaxU

+0

我想第一行像上面提到的'df.groupby(['city','code'])。sum()' – iamsterdam