从此数据框开始
df = pd.DataFrame(
np.arange(3*4).reshape((4, 3)),
index=['a', 'b', 'c', 'd'],
columns=['A', 'B', 'C']
)
print(df)
A B C
a 0 1 2
b 3 4 5
c 6 7 8
d 9 10 11
我想对每一列应用两个函数来为每个原始列生成两列以获得这种形状,并且每个原始列下方嵌套一个多索引列:
A B C
x y x y x y
a 10 100 11 101 12 102
b 13 103 14 104 15 105
c 16 106 17 107 18 108
d 19 109 20 110 21 111
然而,这样的事情不起作用
df.apply(lambda series:
series.transform([lambda x: x+10, lambda x: x+100])
)
并提出ValueError: If using all scalar values, you must pass an index
请注意,我不想像这个答案中那样使用 agg ,因为这不是聚合。我也想避免直接引用列名。
您只需要使用
df.transform()
并赋予您的函数名称。解决方案 1
一种可能的解决方案,其步骤如下:
首先,它创建两个新的数据框:一个为每个元素加 10,另一个为每个元素加 100。
pd.concat
然后,它使用with沿着列连接这些数据框axis=1
并分配键['x', 'y']
以创建分层列索引。该方法
swaplevel
用于先交换列的级别MultiIndex
,然后sort_index
对列进行排序。解决方案 2
另一种可能的解决方案,其步骤如下:
它首先创建两个新的数据框:一个数据框的每个元素添加 10(
df + 10
),另一个数据框的每个元素添加 100(df + 100
)。使用with将这两个数据框组合成一个 3D
numpy
数组,从而得到一个第三维堆叠两个转换的数组。stack
axis=2
然后将数组重塑为具有与 相同行数的二维数组
df
。从这个重塑数组中创建一个新的数据框,并使用 为列分配分层索引
pd.MultiIndex.from_product
。输出: