考虑以下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']
在过去的几个小时中,我已经尝试了一些方法,但是对如何解决此问题一无所知。
我该怎么做?
答案 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']