我有一个看起来像这样的数据框:
我想将x
列除以y
列,但此刻我得到以下结果:
完整示例:
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
理想情况下,我想将结果添加回单独的列中:
是否有一种优雅的方法?
答案 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
-默认情况下会删除选定的级别,因此分隔效果很好(因为x
和y
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
然后将concat
与DataFrame.sort_index
和DataFrame.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