请问您如何计算下面的变量A,B,C,D? 这是我与熊猫的第二天,我很难找到计算它们的方法。
这是我的数据集:
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
现在,我想使用assign方法http://pandas.pydata.org/pandas-docs/stable/dsintro.html#assigning-new-columns-in-method-chains
向数据帧ixmac添加一列 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')))
但不是指定&new-york'我希望这是从相应的行自动派生的
和
ratio_recv = C / D
C是...... ixmac.query('city==["new-york"] & code==[1111]').loc[:,['recv']]
但只采取' recv'编号而不是有问题的数据框,
和' new-york'和' 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']
但不是指定&new-york'我希望这是从相应的行
派生的目标是在名为ixmac
和ration_asn
的数据框ratio_recv
中添加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
答案 0 :(得分: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