函数式编程:如何在作为另一列函数的多索引数据框中创建新列?

Functional Programming: How does one create a new column in a multi-index data frame that is a function of another column?

假设下面的简化数据框。 (实际 df 大得多。)如何为新列 f 赋值,使得 f 是另一列(例如 e)的函数?

df = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]])
df.columns = pd.MultiIndex.from_tuples((("a", "d"), ("a", "e"), ("b", "d"), ("b","e")))
df
    a       b
    d   e   d   e
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12
3  13  14  15  16

期望的输出:

    a             b
    d   e   f     d   e   f
0   1   2 nan     3   4   nan
1   5   6 1.10    7   8   0.69
2   9  10 0.51   11  12   0.41
3  13  14 0.34   15  16   0.29

其中 f 列计算为 np.log(df['e']).diff()

您可以使用 loc 访问 MultiIndex 列,然后直接在切片列上使用函数,然后 join 返回 df:

import numpy as np
df = (df.join(np.log(df.loc[:, (slice(None), 'e')])
              .diff().round(2).rename(columns={'e':'f'}, level=1))
      .sort_index(axis=1))

输出:

    a             b          
    d   e     f   d   e     f
0   1   2   NaN   3   4   NaN
1   5   6  1.10   7   8  0.69
2   9  10  0.51  11  12  0.41
3  13  14  0.34  15  16  0.29
df = {c:df[c].assign(r=np.log(df[(c,'d')]).diff()) for c in df.columns.levels[0]} 

df = pd.concat([df[c] for c in df.keys()], axis=1, keys = df.keys())