将熊猫列以年度系数快速乘以

时间:2018-05-24 14:40:21

标签: python performance pandas multiplication

我有一个带有日期时间索引的数据框:

df = pd.DataFrame(
    {'test':[1, 1, 1, 1, 1, 1]},
    index=[
        '2018-01-01', '2018-01-02', '2018-01-03',
        '2019-01-03', '2019-01-02', '2020-01-02'
    ]
 )
df.index=  pd.to_datetime(df.index)

我有一个年度参数:

yearly_parameter = [1, 2, 3]

我想有效地(以矢量化方式?)列“测试”#39;通过列表annual_parameter中包含的相应年度参数(第一个值是2018年,第二个是2019年,第三个是2020年)。我怎样才能有效地做到这一点?列表是存储这些年度参数进行计算的好方法吗?

我希望列中有以下结果,比如说'回答':

df['answer'] = [1, 1, 1, 2, 2, 3]

print(df)

              test  answer
2018-01-01     1       1
2018-01-02     1       1
2018-01-03     1       1
2019-01-03     1       2
2019-01-02     1       2
2020-01-02     1       3

非常感谢你的帮助,

皮尔

1 个答案:

答案 0 :(得分:3)

pd.factorize

使用factorize建立与yearly_parameter中的元素相对应的年份排序。然后我们可以有效地乘以阵列切片。

预计yearly_parameter的长度至少与df.index

中的唯一年数一样长
f, y = pd.factorize(df.index.year)

yearly_parameter = np.array([1, 2, 3])

df.assign(answer=df.test.values * yearly_parameter[f])

            test  answer
2018-01-01     1       1
2018-01-02     1       1
2018-01-03     1       1
2019-01-03     1       2
2019-01-02     1       2
2020-01-02     1       3

np.unique

请注意,这假设yearly_parameter将其第一个元素与观察到的第一年对齐。如果您打算让第一个元素与所观察的最小年份相对应,那么您应该使用pd.factorize(df.index.year, sort=True)。或者更好的是,如果要进行排序,则在Numpy中使用等效计算

y, f = np.unique(df.index.year, return_inverse=True)

yearly_parameter = np.array([1, 2, 3])

df.assign(answer=df.test.values * yearly_parameter[f])

            test  answer
2018-01-01     1       1
2018-01-02     1       1
2018-01-03     1       1
2019-01-03     1       2
2019-01-02     1       2
2020-01-02     1       3