3 回答

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

TA貢獻1828條經驗 獲得超13個贊
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貢獻2080條經驗 獲得超4個贊
這里有一個替代解決方案,使用相同的求和解決方案,但沒有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
添加回答
舉報