考慮以下內容DataFrames df:
df =
kind A B
names u1 u2 u3 y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.9800 0.0715
和df1:
df1 =
kind A
names potato
Time
0.0 0.4043
0.1 0.9801
0.2 0.1298
0.3 0.9564
0.4 0.4409
我想將兩者連接起來DataFrames,結果DataFrame是:
df2 =
kind A B
names u1 u2 u3 potato y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.5083 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.6748 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.1753 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.5953 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.4409 0.9800 0.0715
我運行的是pandas.concat([df1, df2, axis=1).sort_index(level="kind", axis=1),但這會導致
kind A B
names potato u1 u2 u3 y1 y2
Time
0.0 0.4043 0.5083 0.1007 0.8001 0.7373 0.1387
0.1 0.9801 0.6748 0.0354 0.0076 0.8421 0.2670
0.2 0.1298 0.1753 0.1013 0.5231 0.8060 0.0040
0.3 0.9564 0.5953 0.6505 0.7127 0.0771 0.1023
0.4 0.4409 0.4409 0.0193 0.6765 0.9800 0.0715
即該列potato附加在開頭,df["A"]而我希望將其附加到末尾。
uj5u.com熱心網友回復:
sort_remaining=False在中添加引數DataFrame.sort_index:
df = pd.concat([df1, df2], axis=1).sort_index(level="kind", axis=1, sort_remaining=False)
print (df)
kind A B
names u1 u2 u3 potato y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.4043 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.9801 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.1298 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.9564 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.4409 0.9800 0.0715
uj5u.com熱心網友回復:
這個問題有兩種可能的解決方案,一種比另一種更安全。兩者都依賴于df.insert范式的使用,但是第一個簡單而危險,而第二個稍微復雜一些,但允許更多的“安全性”。
解決方案 1
您可以簡單地使用該df.insert命令,該命令允許在指定索引處插入一列。在您的情況下,這意味著:
df.insert(loc=3, column=df1.columns[0], value=df1.values)
這給出了所需的輸出:
kind A B
names u1 u2 u3 Potato y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.4043 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.9801 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.1298 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.9564 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.4409 0.9800 0.0715
但是,它并不是真正的合并,很容易出現例外。例如,如果 df1 具有不同的長度,它將給出該型別的例外(在示例中具有少 1 個值)。
ValueError: Length of values (4) does not match length of index (5)
這種合并也不是針對索引進行的,即df1在合并中完全忽略了索引。
我建議僅在您確定要合并的資料型別時才使用它。
解決方案 2
首先執行連接然后插入允許考慮不同的索引。這可以這樣做:
df2 = pd.concat([df, df1], axis=1)
colname: tuple = ('A', 'Potato')
colvalue: pd.Series = df2[colname]
df2.pop(colname)
df2.insert(loc=3, column=colname, value=colvalue)
事實上,如果df1有不同的索引,這種方法可以考慮到這一點。
例子
為了解釋這兩種解決方案的不同之處,讓我們考慮其中df和df1具有不同指標的情況。那是:
display(df)
kind A B
names u1 u2 u3 y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.9800 0.0715
和
display(df1)
kind A
names Potato
0.0 0.4043
0.1 0.9801
0.2 0.1298
0.3 0.9564
0.5 0.4409
在這種情況下,解決方案 1將導致以下合并:
df.insert(loc=3, column=df1.columns[0], value=df1.values)
display(df)
kind A B
names u1 u2 u3 Potato y1 y2
Time
0.0 0.5083 0.1007 0.8001 0.4043 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.9801 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.1298 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.9564 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 0.4409 0.9800 0.0715
這是錯誤的。但是,解決方案 2會導致正確的輸出:
df2 = pd.concat([df, df1], axis=1)
colname: tuple = ('A', 'Potato')
colvalue: pd.Series = df2[colname]
df2.pop(colname)
df2.insert(loc=3, column=colname, value=colvalue)
display(df2)
kind A B
names u1 u2 u3 Potato y1 y2
0.0 0.5083 0.1007 0.8001 0.4043 0.7373 0.1387
0.1 0.6748 0.0354 0.0076 0.9801 0.8421 0.2670
0.2 0.1753 0.1013 0.5231 0.1298 0.8060 0.0040
0.3 0.5953 0.6505 0.7127 0.9564 0.0771 0.1023
0.4 0.4409 0.0193 0.6765 NaN 0.9800 0.0715
0.5 NaN NaN NaN 0.4409 NaN NaN
回顧最佳解決方案
使用concat然后使用pop和insert新列。如果你很著急,并且確定你在做什么,你可以繼續使用 `insert,但要小心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527146.html
標籤:Python熊猫
