Python pandas:根据列查找每个列的日志,该日志由另一个数据帧中的标量除以
我有一个数据框架,如下所示:Python pandas:根据列查找每个列的日志,该日志由另一个数据帧中的标量除以,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框架,如下所示: df = pandas.DataFrame(index=pandas.date_range('20200101', '20200107'), columns=['foo', 'bar', 'baz'], data=numpy.random.rand(7,3)) 我为每一列提供了另一个系数数据框架: fac = pandas.DataFrame(index=['foo','b
df = pandas.DataFrame(index=pandas.date_range('20200101', '20200107'),
columns=['foo', 'bar', 'baz'],
data=numpy.random.rand(7,3))
我为每一列提供了另一个系数数据框架:
fac = pandas.DataFrame(index=['foo','bar','baz'],
data={'factor':[1,2,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
它可以工作,但感觉不太符合人体工程学
是否有更好的推荐方法来实现同样的效果(理想情况下是在一行程序中)?您可以将一个数据帧除以一个序列。这样,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
就这么简单!非常感谢。祝贺10万@MarkSetchell谢谢:-)
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
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