熊猫划分多个mutliindex列

时间:2019-07-26 03:49:05

标签: python pandas dataframe

我有一个看起来像这样的数据框:

dataframe

我想将x列除以y列,但此刻我得到以下结果:

result dataframe

完整示例:

import pandas as pd

# create example dataframe
data = {'x': [2, 4, 6], 'y': [1, 2, 3]}
df = pd.DataFrame(data)
df = pd.concat([df, df*10], axis=1, keys=['apple', 'orange'])

# slice just x and y columns
x = df.loc[:, (slice(None), 'x')]
y = df.loc[:, (slice(None), 'y')]

# divide (this doesn't work)
result = x / y

理想情况下,我想将结果添加回单独的列中:

enter image description here

是否有一种优雅的方法?

1 个答案:

答案 0 :(得分:0)

如果rename创建的第二级相同,则您的解决方案有效:

new = (x.rename(columns={'x':'x/y'}) / y.rename(columns={'y':'x/y'}) 
print (new)

  apple orange
    x/y    x/y
0   2.0    2.0
1   2.0    2.0
2   2.0    2.0

或者可以使用DataFrame.xs-默认情况下会删除选定的级别,因此分隔效果很好(因为xy DataFrame中的列相同),因此有必要通过MultiIndex.from_product创建第二级:

x = df.xs('x', axis=1, level=1)
y = df.xs('y', axis=1, level=1)
new = x / y
new.columns = pd.MultiIndex.from_product([new.columns, ['x/y']])
print (new)
  apple orange
    x/y    x/y
0   2.0    2.0
1   2.0    2.0
2   2.0    2.0

然后将concatDataFrame.sort_indexDataFrame.reindex结合使用:

df = pd.concat([df, new], axis=1).sort_index(axis=1).reindex(['x','x/y','y'], axis=1, level=1)
print (df)
  apple         orange         
      x  x/y  y      x  x/y   y
0     2  2.0  1     20  2.0  10
1     4  2.0  2     40  2.0  20
2     6  2.0  3     60  2.0  30