熊猫:根据列

时间:2021-02-08 14:34:02

标签: python pandas dataframe

我有一个数据数据框,如下所示:

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

它有效,但感觉不太符合人体工程学。

是否有更好的推荐方法来实现相同的目标(最好是单行)?

1 个答案:

答案 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