【问题标题】:pandas: apply calculation for each month accross dataset with monthly specific constantpandas:对具有每月特定常数的数据集应用每个月的计算
【发布时间】:2021-03-05 01:21:52
【问题描述】:

我正在努力寻找一种方法,使用 python pandas 将每月值从 df 乘以每月索引。

我解释: 我有一个传统的时间序列数据集:

Id          AAA   BBBB  CCCC
2017-03-31       0       0       0
2017-04-30       0       0       0
2017-05-31       0       0       0
2017-06-30       0       0       0
2017-07-31       0       0       0
2017-08-31       0       0       0
2017-09-30       0       0       0
2017-10-31       0       0       0
2017-11-30       0       0       0
2017-12-31       0       0       0
2018-01-31       1       0       0
2018-02-28       0     204       0
2018-03-31       0       0       0
2018-04-30       0       0       0
2018-05-31      80     130       0
2018-06-30       0       0       0
2018-07-31       5     252       0
2018-08-31       0     290       0
2018-09-30       0       0       0
2018-10-31       1     230       0
2018-11-30      92      60       0
2018-12-31       0       0       0
2019-01-31       0      40       0
2019-02-28      16      48       0
2019-03-31       0       0       0
2019-04-30       0     224       0
2019-05-31      30     270       0
2019-06-30       0       0       0
2019-07-31      13     284       0
2019-08-31       0       0       0
2019-09-30       0     112       0
2019-10-31       0     134       0
2019-11-30       0       0       0
2019-12-31       0      50       0
2020-01-31       0       0       0
2020-02-29       0       0       0
2020-03-31       0       0       0
2020-04-30      10      67       0
2020-05-31       0       0       0
2020-06-30       0      54       1

我有每月索引:

Id    AAA    BBBB       CCCC
1   0.055046  0.212131     0.0
2   0.880734  1.336427     0.0
3   0.000000  0.000000     0.0
4   0.412844  1.157441     0.0
5   4.541284  1.590984     0.0
6   0.000000  0.214783    12.0
7   0.990826  2.842559     0.0
8   0.000000  1.537952     0.0
9   0.000000  0.593968     0.0
10  0.055046  1.930394     0.0
11  5.064220  0.318197     0.0
12  0.000000  0.265164     0.0

目标是将第一个数据集的每个月除以第二个数据集的相应索引。 即 2019 年 6 月 30 日起产品 AAA 的值应除以指数为 6 的季节指数

如何在 pandas 中做到这一点?

【问题讨论】:

  • 你的CCCC月度指数怎么办?这显然是除以零。
  • 我计划使用过滤器来删除索引为 0 的列,或者将它们调整为超过 0。我的问题更多是关于使用每月各自的常量实现多月计算的方法跨度>
  • df.set_index(df['Id'].dt.month).merge(df2.set_index('Id'), how='left', left_index=True, right_index=True) 在此之后您可以划分您选择的列
  • 我尝试了你的代码并给了我错误:AttributeError: 'DatetimeIndex' object has no attribute 'dt'

标签: python pandas date


【解决方案1】:

又快又脏:pd.merge() left_on 是日期时间索引的月份,right_on 是索引 (Id)。可以随后计算逐元素商。

数据

import pandas as pd
import io

df1 = pd.read_csv(io.StringIO("""
Id             AAA    BBBB    CCCC
2017-03-31       0       0       0
2017-04-30       0       0       0
2017-05-31       0       0       0
2017-06-30       0       0       0
2017-07-31       0       0       0
2017-08-31       0       0       0
2017-09-30       0       0       0
2017-10-31       0       0       0
2017-11-30       0       0       0
2017-12-31       0       0       0
2018-01-31       1       0       0
2018-02-28       0     204       0
2018-03-31       0       0       0
2018-04-30       0       0       0
2018-05-31      80     130       0
2018-06-30       0       0       0
2018-07-31       5     252       0
2018-08-31       0     290       0
2018-09-30       0       0       0
2018-10-31       1     230       0
2018-11-30      92      60       0
2018-12-31       0       0       0
2019-01-31       0      40       0
2019-02-28      16      48       0
2019-03-31       0       0       0
2019-04-30       0     224       0
2019-05-31      30     270       0
2019-06-30       0       0       0
2019-07-31      13     284       0
2019-08-31       0       0       0
2019-09-30       0     112       0
2019-10-31       0     134       0
2019-11-30       0       0       0
2019-12-31       0      50       0
2020-01-31       0       0       0
2020-02-29       0       0       0
2020-03-31       0       0       0
2020-04-30      10      67       0
2020-05-31       0       0       0
2020-06-30       0      54       1
"""), sep=r"\s{2,}", engine="python")

df1["Id"] = pd.to_datetime(df1["Id"])
df1.set_index("Id", inplace=True)

df2 = pd.read_csv(io.StringIO("""
Id       AAA      BBBB    CCCC
1   0.055046  0.212131     0.0
2   0.880734  1.336427     0.0
3   0.000000  0.000000     0.0
4   0.412844  1.157441     0.0
5   4.541284  1.590984     0.0
6   0.000000  0.214783    12.0
7   0.990826  2.842559     0.0
8   0.000000  1.537952     0.0
9   0.000000  0.593968     0.0
10  0.055046  1.930394     0.0
11  5.064220  0.318197     0.0
12  0.000000  0.265164     0.0
"""), sep=r"\s{2,}", engine="python")

df2.set_index("Id", inplace=True)

代码

df_joined = df1.merge(df2, how="left", left_on=df1.index.month, right_on="Id")

for col in df1.columns:  # or ["AAA", "BBBB", "CCCC"]
    df1[col] = (df_joined[f"{col}_x"] / df_joined[f"{col}_y"]).values

del df_joined

结果

print(df1)

                  AAA        BBBB      CCCC
Id                                         
2017-03-31        NaN         NaN       NaN
2017-04-30   0.000000    0.000000       NaN
2017-05-31   0.000000    0.000000       NaN
2017-06-30        NaN    0.000000  0.000000
2017-07-31   0.000000    0.000000       NaN
2017-08-31        NaN    0.000000       NaN
2017-09-30        NaN    0.000000       NaN
2017-10-31   0.000000    0.000000       NaN
2017-11-30   0.000000    0.000000       NaN
2017-12-31        NaN    0.000000       NaN
2018-01-31  18.166624    0.000000       NaN
2018-02-28   0.000000  152.645824       NaN
2018-03-31        NaN         NaN       NaN
2018-04-30   0.000000    0.000000       NaN
2018-05-31  17.616163   81.710438       NaN
2018-06-30        NaN    0.000000  0.000000
2018-07-31   5.046295   88.652513       NaN
2018-08-31        NaN  188.562452       NaN
2018-09-30        NaN    0.000000       NaN
2018-10-31  18.166624  119.146661       NaN
2018-11-30  18.166667  188.562431       NaN
2018-12-31        NaN    0.000000       NaN
2019-01-31   0.000000  188.562728       NaN
2019-02-28  18.166666   35.916664       NaN
2019-03-31        NaN         NaN       NaN
2019-04-30   0.000000  193.530383       NaN
2019-05-31   6.606061  169.706295       NaN
2019-06-30        NaN    0.000000  0.000000
2019-07-31  13.120366   99.909975       NaN
2019-08-31        NaN    0.000000       NaN
2019-09-30        NaN  188.562347       NaN
2019-10-31   0.000000   69.415881       NaN
2019-11-30   0.000000    0.000000       NaN
2019-12-31        NaN  188.562550       NaN
2020-01-31   0.000000    0.000000       NaN
2020-02-29   0.000000    0.000000       NaN
2020-03-31        NaN         NaN       NaN
2020-04-30  24.222224   57.886320       NaN
2020-05-31   0.000000    0.000000       NaN
2020-06-30        NaN  251.416546  0.083333

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2023-03-06
    • 2017-04-28
    相关资源
    最近更新 更多