我有一个 pandas 数据框,其中的数据按如下所示分类:(我正在显示示例数据)
df
id qtr value
a Q01 100
a Q02 130
a Q03 160
a Q04 100
b Q01 1000
b Q02 1300
b Q03 1600
b Q04 1000
现在我要解决的问题是将季度值重新分配到月份,如下所示: 我想将季度值分配为 3,并将该值分配给前两个月,将剩余分配给该季度的最后一个月。所以我的输出应该如下所示
outdf
id qtr mnth value
a Q01 M01 30
a Q01 M02 30
a Q01 M03 40
a Q02 M04 40
a Q02 M05 40
a Q02 M06 50
a Q03 M07 50
a Q03 M08 50
a Q03 M09 60
a Q04 M10 30
a Q04 M11 30
a Q04 M12 40
b Q01 M01 300
b Q01 M02 300
b Q01 M03 400
b Q02 M04 400
b Q02 M05 400
b Q02 M06 500
b Q03 M07 500
b Q03 M08 500
b Q03 M09 600
b Q04 M10 300
b Q04 M11 300
b Q04 M12 400
所以我到目前为止尝试过如下:
我创建了一个宿舍映射:
quarters = {'Q01': ['M01','M02','M03'], 'Q02': ['M04','M05','M06'],
'Q03': ['M07','M08','M09'], 'Q04': ['M10', 'M11', 'M12']}
并且尝试使用这个技巧来融化和爆炸数据框:
out = (df.melt(['id'], value_name='value', var_name='qtr')
.assign(rev=lambda d: d['value'],#.div(3),
qtr=lambda d: d['qtr'].str[-2:].map(quarters)
).explode('qtr'))
不幸的是它没有做我想做的事。任何有关如何实现我的输出的帮助都会有帮助和感激。
最佳答案
只是尝试以一种有点冗长的方式解决它们。希望这个方法有帮助!
目前,我正在使用一些自定义舍入,但我希望您可以继续这样做
下面是代码
import pandas as pd
data = {'id': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'],
'qtr': ['Q01', 'Q02', 'Q03', 'Q04', 'Q01', 'Q02', 'Q03', 'Q04'],
'value': [100, 130, 160, 100, 1000, 1300, 1600, 1000]}
df = pd.DataFrame(data)
quarters_to_months = {
'Q01': ['M01', 'M02', 'M03'],
'Q02': ['M04', 'M05', 'M06'],
'Q03': ['M07', 'M08', 'M09'],
'Q04': ['M10', 'M11', 'M12']
}
result_df = pd.DataFrame(columns=['id', 'qtr', 'mnth', 'value'])
for _, row in df.iterrows():
qtr = row['qtr']
months = quarters_to_months[qtr]
for i, month in enumerate(months):
if i == 2:
result_df = pd.concat([result_df,pd.DataFrame({'id': row['id'], 'qtr': qtr, 'mnth': month, 'value': (row['value'] * 0.4)}, index=[0])], ignore_index=True)
else:
result_df = pd.concat([result_df,pd.DataFrame({'id': row['id'], 'qtr': qtr, 'mnth': month, 'value': (row['value'] * 0.3)}, index=[0])], ignore_index=True)
result_df.sort_values(by=['id', 'qtr', 'mnth'], inplace=True)
result_df.reset_index(drop=True, inplace=True)
def custom_round(value):
if(value>100):
return round(value, -2)
else:
return round(value, -1)
result_df['value'] = result_df['value'].apply(custom_round)
print(result_df)
输出
关于pandas - 以不同的时间间隔分布 Pandas 数据框中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77232406/