![](/img/trans.png)
[英]python pandas dataframe how to apply a function to each time period
[英]How to generate values inside a time period in a python dataframe?
我有一个特定周期范围内的一些数据(周期 0、1、2 ...),我想创建周期内的值,这些值将获得值的差异并除以周期总数放;
例如:
import pandas as pd
data = [{'metric': '3f00d0b5', 'time':52.66, 'time_order': 0, 'variable': 'var1', 'value': 0.035},
{'metric': '3f00d0b5', 'time':422.4, 'time_order': 1, 'variable': 'var1', 'value': 0.512},
{'metric': '3f00d0b5', 'time':620.1, 'time_order': 2, 'variable': 'var1', 'value': 0.0},
{'metric': '3f00d0b5', 'time':52.66, 'time_order': 0, 'variable': 'var2', 'value': 0.007},
{'metric': '3f00d0b5', 'time':422.4, 'time_order': 1, 'variable': 'var2', 'value': 0.012},
{'metric': '3f00d0b5', 'time':620.1, 'time_order': 2, 'variable': 'var2', 'value': 0.214},
{'metric': '83e7fdd1', 'time':25.42, 'time_order': 0, 'variable': 'var1', 'value': 0.0},
{'metric': '83e7fdd1', 'time':322.45, 'time_order': 1, 'variable': 'var1', 'value': 0.241},
{'metric': '83e7fdd1', 'time':678.12, 'time_order': 2, 'variable': 'var1', 'value': 0.005},
{'metric': '83e7fdd1', 'time':25.42, 'time_order': 0, 'variable': 'var2', 'value': 0.02},
{'metric': '83e7fdd1', 'time':322.45, 'time_order': 1, 'variable': 'var2', 'value': 0.007},
{'metric': '83e7fdd1', 'time':678.12, 'time_order': 2, 'variable': 'var2', 'value': 0.0}
]
df = pd.DataFrame.from_dict(data)
根据上面的数据,我要寻找的最终结果是:
{'metric': '3f00d0b5', 'time':52.66, 'time_order': 0, 'variable': 'var1', 'value': 0.035},
{'metric': '3f00d0b5', 'time':52.66, 'time_order': 0.1, 'variable': 'var1', 'value': 0.083},
...
{'metric': '3f00d0b5', 'time':52.66, 'time_order': 0.9, 'variable': 'var1', 'value': 0.4643},
{'metric': '3f00d0b5', 'time':422.4, 'time_order': 1, 'variable': 'var1', 'value': 0.512},
有一种直接的方法可以用 pythonic 方式实现吗?
提前谢谢你,莱昂纳多
您可以使用groupby
和自定义 function 来扩充数据:
def data_augment(df):
new_index = np.arange(df['time_order'].min(), df['time_order'].max()+0.1, 0.1)
return (df.set_index('time_order')['value']
.reindex(new_index).interpolate())
out = (df.groupby(['metric', 'variable']).apply(data_augment)
.stack().rename('value').reset_index()[df.columns])
Output:
>>> out
metric time_order variable value
0 3f00d0b5 0.0 var1 0.0350
1 3f00d0b5 0.1 var1 0.0827
2 3f00d0b5 0.2 var1 0.1304
3 3f00d0b5 0.3 var1 0.1781
4 3f00d0b5 0.4 var1 0.2258
.. ... ... ... ...
79 83e7fdd1 1.6 var2 0.0028
80 83e7fdd1 1.7 var2 0.0021
81 83e7fdd1 1.8 var2 0.0014
82 83e7fdd1 1.9 var2 0.0007
83 83e7fdd1 2.0 var2 0.0000
[84 rows x 4 columns]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.