python - 如何计算 python pandas dataframe 中的复合指标

标签 python pandas data-analysis

请教一下如何计算下面的变量A、B、C、D? 这是我接触 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 向数据框 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 is sth close 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_asnratio_recv 的额外行,并根据以下内容计算这两列中的每个单元格上面的例子。

您能建议/帮助计算 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

最佳答案

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

关于python - 如何计算 python pandas dataframe 中的复合指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41814732/

相关文章:

python - 如何使用opencv从图形中删除其他对象?

python - 使用过滤器和关联列表过滤图像列表

python - 使用带有自制对象的 read_csv 作为 'file'

python - 如何在列表中找到最常见的元素,如果有平局,最后一次出现的是第一个?

python - 将 Pandas 数据框拆分为多个行数相等的数据框

python - 数据帧的unicode数据到字符串

python - Pandas 根据另一列条件下的值的随机样本替换 NaN 值

r - 使用R来获取波动率,并使用Peak求平均值。互联网流量数据比例

python - 为 Pandas DataFrame 的图形设置 x 轴间隔(刻度)

python - 如何连接 pandas.DataFrame() 中的特定列?