函数式编程:如何在作为另一列函数的多索引数据框中创建新列?
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())
假设下面的简化数据框。 (实际 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())