我有一个熊猫数据框,其格式如下。
Index CITY YEAR MONTH HOUR TEMP DP CC ASTR BSTR 2018-04-10 00:00:00 AAA 2018 4 1 20 10 0 hd pv 2018-04-10 01:00:00 AAA 2018 4 2 10 10 10 fg pv ... 2018-04-10 00:00:00 BBB 2018 4 1 30 20 5 cv er 2018-04-10 01:00:00 BBB 2018 4 2 20 20 5 hd fd ... 2018-04-10 00:00:00 CCC 2018 4 1 20 30 10 cv fd 2018-04-10 01:00:00 CCC 2018 4 2 10 10 5 df ee ...
然后输出应类似于:
Index YEAR MONTH HOUR TEMP DP CC ASTR BSTR 2018-04-10 00:00:00 2018 4 1 24 20 5 cv er 2018-04-10 01:00:00 2018 4 2 14 14 6.5 hd fd ...
其中TEMP,DP和CC列是每个唯一索引(索引是日期时间)的每个CITY值的加权平均值,而ASTR和BSTR只是BBB的值。 YEAR,MONTH和HOUR应该保持不变。 上面示例的权重可以通过以下字典给出: 权重= {“ AAA”:0.3,“ BBB”:0.4,“ CCC”:0.3}
我的实际数据具有多个城市超过4年的每小时数据,因此,我想为您提供有效解决方案的帮助,谢谢!
答案 0 :(得分:1)
给出以下数据框:
df = pd.DataFrame([['2018-04-10 00:00:00', 'AAA', 2018, 4, 1, 20, 10, 0, 'hd', 'pv'],
['2018-04-10 01:00:00', 'AAA', 2018, 4, 2, 10, 10, 10, 'fg', 'pv'],
['2018-04-10 00:00:00', 'BBB', 2018, 4, 1, 30, 20, 5, 'cv', 'er'],
['2018-04-10 01:00:00', 'BBB', 2018, 4, 2, 20, 20, 5, 'hd', 'fd'],
['2018-04-10 00:00:00', 'CCC', 2018, 4, 1, 20, 30, 10, 'cv', 'fd'],
['2018-04-10 01:00:00', 'CCC', 2018, 4, 2, 10, 10, 5, 'df', 'ee']],
columns = ['Index','CITY','YEAR','MONTH','HOUR','TEMP','DP','CC','ASTR','BSTR'])
重量:
weights = {"AAA" : 0.3, "BBB" : 0.4, "CCC" : 0.3}
您可以执行以下操作:
w_a = lambda x: np.average(x, weights=list(weights.values()))
new = df.groupby('Index').agg({'TEMP': w_a, 'DP': w_a, 'CC': w_a})
new = new.join(df[df['CITY']=='BBB'][['Index','YEAR','MONTH','HOUR','ASTR','BSTR']].set_index('Index'), on='Index')
哪个给:
TEMP DP CC YEAR MONTH HOUR ASTR BSTR
Index
2018-04-10 00:00:00 24 20 5.0 2018 4 1 cv er
2018-04-10 01:00:00 14 14 6.5 2018 4 2 hd fd
请注意,此解决方案假定weights
词典中的键的提供顺序与城市在原始CITY
的{{1}}列中显示的顺序相同(即,按字母顺序排序)