Как разделить многоуровневые столбцы на Python - PullRequest
1 голос
/ 07 февраля 2020

У меня есть df как это:

arrays = [['bar', 'bar', 'baz', 'baz'],
          ['one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 4), index=['A', 'B', 'C'], columns=index)
df.head()

возвращение:

enter image description here

Я хочу добавить несколько столбцов, где все измерения второго уровня делятся друг на друга - один столбец делится на один баз, а второй - на второй базис, et c.

df[["bar"]]/df[["baz"]]

и

df[["bar"]].div(df[["baz"]])

возвращает NaN

1 Ответ

2 голосов
/ 07 февраля 2020

Вы можете выбрать оба уровня только одним []:

df1 = df["bar"]/df["baz"]
print (df1)
second        one        two
A        1.564478  -0.115979
B       14.604267 -19.749265
C       -0.511788  -0.436637

Если хотите добавить MultiIndex добавить MultiIndex.from_product:

df1.columns = pd.MultiIndex.from_product([['new'], df1.columns], names=df.columns.names)
print (df1)
first         new           
second        one        two
A        1.564478  -0.115979
B       14.604267 -19.749265
C       -0.511788  -0.436637

Другая идея для MultiIndex в выводе - использовать ваше решение с rename столбцами с одинаковыми именами, здесь new:

df2 = df[["bar"]].rename(columns={'bar':'new'})/df[["baz"]].rename(columns={'baz':'new'})
print (df2)
first         new           
second        one        two
A        1.564478  -0.115979
B       14.604267 -19.749265
C       -0.511788  -0.436637
...