3 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
我擺弄了一會(huì)兒,這是我認(rèn)為可以解決問題的一句臺(tái)詞。它是完全矢量化的,并且不尋址特定的列名稱。它還會(huì)將add
列放置在正確的位置。
df.stack(0).assign(add=df.stack(0).sum(axis=1)).stack(0).unstack(0).T
不幸的是,由于 stack / unstack 的特性是對(duì)最內(nèi)層進(jìn)行入棧 / 出棧,因此需要神秘的.stack(0).unstack(0)操作??雌饋磉@兩個(gè)操作應(yīng)該互相抵消,但它們實(shí)際上在保持順序的同時(shí)打亂索引級(jí)別。
這是同樣的事情,分為 3 行,沒有賦值語句。
df = df.stack(0)
df['add'] = df.sum(axis=1)
df = df.stack(0).unstack(0).T

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
pandas.DataFrame.sum與axis=1和 一起使用level=0:
df2 = df.sum(axis=1, level=0)
print(df2)
輸出:
one two
0 1 5
1 9 13
2 17 21
然后您可以將新的列名稱添加到pandas.concat:
df2.columns = [(c, "add") for c in df2]
df2 = pd.concat([df, df2], 1).sort_index(1)
print(df2)
輸出:
one two
add bar foo add bar foo
0 1 1 0 5 3 2
1 9 5 4 13 7 6
2 17 9 8 21 11 10

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
這里有一個(gè)替代解決方案,使用相同的求和解決方案,但沒有pd.concat:
df[("one", "add")] = None
df[("two", "add")] = None
df.iloc[:, -2:] = df.sum(axis=1, level=0).to_numpy()
df.sort_index(1)
one two
add bar foo add bar foo
0 1.0 1 0 5.0 3 2
1 9.0 5 4 13.0 7 6
2 17.0 9 8 21.0 11 10
添加回答
舉報(bào)