我有一个数据数据框,如下所示:
df = pandas.DataFrame(index=pandas.date_range('20200101', '20200107'),
columns=['foo', 'bar', 'baz'],
data=numpy.random.rand(7,3))
<块引用>
print(df)
foo bar baz
2020-01-01 0.641336 0.185073 0.815814
2020-01-02 0.616637 0.438274 0.750864
2020-01-03 0.336463 0.548659 0.661161
2020-01-04 0.924278 0.560541 0.341154
2020-01-05 0.608545 0.674169 0.242851
2020-01-06 0.459625 0.816147 0.113926
2020-01-07 0.781475 0.865262 0.625729
每列我都有另一个因子数据框:
fac = pandas.DataFrame(index=['foo','bar','baz'],
data={'factor':[1,2,3]})
<块引用>
print(fac)
factor
foo 1
bar 2
baz 3
我想计算每行的对数,除以相应列的因子
类似于:
numpy.log(df['foo']) / fac['foo'] # for each column, foo, bar, baz
我找到了以下解决方案,该解决方案创建 df
的副本,然后迭代每一列,将复制的数据框中的值设置为我要计算的表达式的结果。
res = df.copy()
for c in df.columns:
res[c] = numpy.log(df[c]) / fac.loc[c].values
<块引用>
print(res)
foo bar baz
2020-01-01 -0.444202 -0.843503 -0.067856
2020-01-02 -0.483475 -0.412456 -0.095510
2020-01-03 -1.089267 -0.300139 -0.137919
2020-01-04 -0.078743 -0.289427 -0.358474
2020-01-05 -0.496685 -0.197138 -0.471769
2020-01-06 -0.777345 -0.101580 -0.724067
2020-01-07 -0.246572 -0.072361 -0.156279
它有效,但感觉不太符合人体工程学。
是否有更好的推荐方法来实现相同的目标(最好是单行)?
答案 0 :(得分:2)
您可以按系列划分数据框。这样做时,Pandas 会将数据框的列与系列的索引对齐。所以这可以通过以下方式完成:
np.log(df)/fac['factor']
输出:
foo bar baz
2020-01-01 -0.444202 -0.843502 -0.067856
2020-01-02 -0.483475 -0.412455 -0.095510
2020-01-03 -1.089267 -0.300139 -0.137919
2020-01-04 -0.078742 -0.289426 -0.358474
2020-01-05 -0.496684 -0.197137 -0.471769
2020-01-06 -0.777344 -0.101580 -0.724069
2020-01-07 -0.246572 -0.072361 -0.156279