合并多行并计算值

时间:2019-03-15 00:59:55

标签: python pandas

考虑以下MVCE:

import pandas as pd

data_in = [
  { 'company': 'A', 'time': 1552521600, 'interval': 'hour', 'violations': 0, 'handled': 400 },
  { 'company': 'A', 'time': 1552525200, 'interval': 'hour', 'violations': 2, 'handled': 300 },
  { 'company': 'A', 'time': 1552528800, 'interval': 'hour', 'violations': 0, 'handled': 20 },
  { 'company': 'A', 'time': 1552521600, 'interval': 'day', 'violations': 3, 'handled': 1800 },

  { 'company': 'B', 'time': 1552521600, 'interval': 'hour', 'violations': 1, 'handled': 200 },
  { 'company': 'B', 'time': 1552525200, 'interval': 'hour', 'violations': 1, 'handled': 200 },
  { 'company': 'B', 'time': 1552528800, 'interval': 'hour', 'violations': 2, 'handled': 400 },
  { 'company': 'B', 'time': 1552521600, 'interval': 'day', 'violations': 4, 'handled': 1400 },
]

df = pd.DataFrame(data_in).set_index(['company', 'time'])
df.sort_index(axis=0, inplace=True)

对于每家公司,我要在这里完成的工作是,将给定小时内的违规次数与每日总违规次数进行比较,以及违规次数与所处理单位数之间的关系。

让我更接近一步的步骤是使用数据透视表:

pv = df.pivot_table(index=['company', 'time'], columns='interval')
print(df)

产生

                   handled        violations
interval               day   hour        day hour
company time
A       1552521600  1800.0  400.0        3.0  0.0
        1552525200     NaN  300.0        NaN  2.0
        1552528800     NaN   20.0        NaN  0.0
B       1552521600  1400.0  200.0        4.0  1.0
        1552525200     NaN  200.0        NaN  1.0
        1552528800     NaN  400.0        NaN  2.0

我相信我想要得到的是

                   handled        violations
interval               day   hour        day hour
company time
A       1552521600  1800.0  400.0        3.0  0.0
        1552525200  1800.0  300.0        3.0  2.0
        1552528800  1800.0   20.0        3.0  0.0
B       1552521600  1400.0  200.0        4.0  1.0
        1552525200  1400.0  200.0        4.0  1.0
        1552528800  1400.0  400.0        4.0  2.0

我要进行的计算大致是这样:

pv['hv_ratio'] = pv['handled.hour'] / pv['violations.hour']
pv['v_ratio'] = pv['violations.hour'] / pv['violations.day']

在过去的几个小时中,我已经尝试了一些方法,但是对如何解决此问题一无所知。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我认为您只需要使用ffill,然后计算您的 hv_ratio v_ratio 列如下:

pv.ffill(inplace=True)
pv['hv_ratio'] = pv['handled']['hour'] / pv['violations']['hour']
pv['v_ratio'] = pv['violations']['hour'] / pv['violations']['day']