簡體   English   中英

pandas,如何將列添加到多索引列 DataFrame

[英]pandas, how to add columns to a multiindex column DataFrame

這是我的原始 DataFrame(帶有多索引列):

In [72]:df
Out[72]: 
          a                   b          
          x         y         x         y
0  1.545293 -0.459270  0.899254 -1.010453
1  0.458760  0.275400 -0.190951  0.169195
2 -0.941817  1.109823  0.077953 -0.247074
3  1.790101 -1.643470  0.979625 -1.704657
4 -2.044814 -0.243726 -0.039724  0.600066

我還有另一個數據幀:

In [77]:df2
Out[77]: 
          x         y
0 -1.085869 -0.952949
1  0.601585  0.570050
2  0.328601  0.802610
3 -0.415952 -0.090088
4  0.757545 -0.736933

如何將df2的列添加到df以獲得這樣的新 DataFrame:

In [83]:df3
Out[83]: 
          a                   b                   c          
          x         y         x         y         x         y
0  1.545293 -0.459270  0.899254 -1.010453 -1.085869 -0.952949
1  0.458760  0.275400 -0.190951  0.169195  0.601585  0.570050
2 -0.941817  1.109823  0.077953 -0.247074  0.328601  0.802610
3  1.790101 -1.643470  0.979625 -1.704657 -0.415952 -0.090088
4 -2.044814 -0.243726 -0.039724  0.600066  0.757545 -0.736933

我目前的方法是使用 for 循環:

for col in df2.columns:
    df['c', col] = df2[col]

有什么方法可以避免循環嗎?

試試pd.concat

pieces = {'a' : df1['a'],
          'b' : df1['b'],
          'c' : df2}
df3 = pd.concat(pieces, axis=1)

我發現了另一種在一般情況下(運行 Python 3.6)執行此操作的方法,而無需顯式解構DataFrame 您可以將pd.concat與字典參數一起使用,

df3 = pd.concat({**df1, **{('c',nm):val for nm,val in df2.items()})

** DataFrame對象的擴展似乎返回一個“名稱”等於列名字符串/值的系列對象字典,或者如果列是MultiIndexed ,則包含列字符串/值的層次結構的元組。 然后,當將pd.concat作為字典讀回時, Pandas從元組重新構造 MultiIndexed 列。

請注意,這比您所做的直接分配效率低得多! 由於它必須解構數據幀的每一列和MultiIndex,然后重新組合。

我認為堆疊是這里最好的解決方案:

# First stack df and df2
df, df2 = df.stack(), df2.stack()

# Then add df2 to df as a column
df2['c'] = df2

# Now unstack
df2 = df2.unstack()

首先,將列級別(“c”)添加到df2 然后,連接兩個數據幀。

df2.columns = pd.MultiIndex.from_product(["c"], df.columns])
df = pd.concat([df, df2], axis=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM