首页 > 解决方案 > 如何将另一列上的一列乘以该月第一天的值

问题描述

我想将 'A' 列中的值乘以 'B' 列中每月第一天的值,因此在 1/2017 中,BTC 为 0.27,ETH 为 0.83。2017 年 2 月,BTC 为 0.16,ETH 为 0.88。

我有以下数据框:

Date'       Symbol' A'  B'    'C'
1/1/2017     BTC    22  0.27  5.94
             ETH    21  0.83  17.43
1/2/2017     BTC    23  0.26  6.21
             ETH    24  0.88  19.02
1/3/2017     BTC    25  0.28  6.75
             ETH    21  0.84  17.43
1/4/2017     BTC    24  0.22  6.48
             ETH    23  0.83  19.09
...         ... ...

1/30/2017    BTC    25  0.46  6.75
             ETH    23  0.98  19.09         
1/31/2017    BTC    12  0.27  3.24
             ETH    11  0.73  9.13
2/1/2017     BTC    43  0.16  6.88
             ETH    32  0.88  28.16     
2/2/2017     BTC    24  0.26  3.84
             ETH    21  0.55  18.48

“C”列是预期的输出。

标签: pythonpandas

解决方案


首先在第一级创建 DatetimeIndex MultiIndex

lvl0 = pd.to_datetime(df.index.get_level_values(0), format='%m/%d/%Y')
lvl1 = df.index.get_level_values(1)

df.index = [lvl0, lvl1]

然后将DatetimeIndex.to_periodwithGroupBy.transform和函数first用于与原始 DataFrame 大小相同的系列,因此可能有多个值:

first = df['B'].groupby([df.index.get_level_values(0).to_period('m'), lvl1]).transform('first')

df['C'] = df['A'] * first

print (df)
                    A     B      C
Date       Symbol                 
2017-01-01 BTC     22  0.27   5.94
           ETH     21  0.83  17.43
2017-01-02 BTC     23  0.26   6.21
           ETH     24  0.88  19.92
2017-01-03 BTC     25  0.28   6.75
           ETH     21  0.84  17.43
2017-01-04 BTC     24  0.22   6.48
           ETH     23  0.83  19.09
...
2017-01-30 BTC     25  0.46   6.75
           ETH     23  0.98  19.09
2017-01-31 BTC     12  0.27   3.24
           ETH     11  0.73   9.13
2017-02-01 BTC     43  0.16   6.88
           ETH     21  0.88  18.48
2017-02-02 BTC     24  0.26   3.84
           ETH     21  0.88  18.48

推荐阅读