pandas - 以不同的时间间隔分布 Pandas 数据框中的值

标签 pandas datetime mapping grouping pandas-explode

我有一个 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)

输出

enter image description here

关于pandas - 以不同的时间间隔分布 Pandas 数据框中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77232406/

相关文章:

python - Pandas Group 2-D NumPy 数据(按值范围)

python - 使用 spotipy 提取艺术家流派和歌曲发布日期

c# - 如何使用 Oracle 日期格式将 DateTime 转换为 C# 中的字符串

python - 如何将 Pandas 系列字符串转换为包含 1970 年之前日期的非标准格式的 Pandas 日期时间

java - 在 Hibernate 4 中定义默认类型映射

python-3.x - 如何在 Pandas 数据框中添加复选框

基于连续相同行的熊​​猫聚合

更新前的 MySQL 触发器 - 从字符串设置日期格式

c# - 使用 csvhelper 进行映射/写入协助

java - 将树状映射转换为具有复合键的普通映射