我有兩個 Dataframes
df1 = pd.DataFrame(
{
"A": ["1", "3", "22", "43"],
"B": ["6", "19", "4", "31"],
"C": ["47", "15", "8", "19"],
},
index=[0, 1, 2, 3],
)
df2 = pd.DataFrame(
{
"A": ["65", "47", "6", "13"],
"B": ["29", "5", "2", "21"],
"C": ["69", "9", "11", "80"],
},
index=[4, 5, 6, 7],
)
通過使用pandas,最終結果應該是:
A B C Ti ID
0 1 6 47 am 01
1 3 19 15 am 01
2 22 4 8 am 01
3 43 31 19 am 01
4 65 29 69 pm 01
5 47 5 9 pm 01
6 6 2 11 pm 01
7 13 21 80 pm 01
我瀏覽了Pandas 檔案,并嘗試Dataframes使用pd.concat. 代碼是:
new_df = pd.concat([df1, df2], keys=['am', 'pm']).reset_index()
然而,新的Dataframe出現了一個額外的列level_1,我不希望它在那里:
level_0 level_1 A B C
0 am 0 1 6 47
1 am 1 3 19 15
2 am 2 22 4 8
3 am 3 43 31 19
4 pm 4 65 29 69
5 pm 5 47 5 9
6 pm 6 6 2 11
7 pm 7 13 21 80
我知道reset_index()創建了不需要的列。但為什么?
還要做什么才能獲得相同的最終Dataframe使用pandas?
uj5u.com熱心網友回復:
連接資料幀后,
new_df = pd.concat([df1, df2], keys=['am', 'pm'])
new_df 好像
A B C
am 0 1 6 47
1 3 19 15
2 22 4 8
3 43 31 19
pm 4 65 29 69
5 47 5 9
6 6 2 11
7 13 21 80
如果我們查看 index new_df.index,它是一個 MultiIndex ,其中第一級是鍵,第二級是舊索引:
MultiIndex([('am', 0),
('am', 1),
('am', 2),
('am', 3),
('pm', 4),
('pm', 5),
('pm', 6),
('pm', 7)],
)
然后首先我們可以使用 重命名 MultiIndex 級別rename_axis,reset_index但只從索引中洗掉第一個級別(然后成為具有其名稱的列)。請注意,默認情況下,reset_index會從索引中洗掉所有級別。這就是為什么你看到的level_0和level_1后加列reset_index。
new_df = new_df.rename_axis(['Ti', None]).reset_index(level=0)
您可以通過使用具有所需順序的列串列重新分配 DataFrame 來重新排列列。
cols = new_df.columns.tolist()
new_df = new_df[cols[1:] [cols[0]]]
new_df['ID'] = '01'
輸出:
A B C Ti ID
0 1 6 47 am 01
1 3 19 15 am 01
2 22 4 8 am 01
3 43 31 19 am 01
4 65 29 69 pm 01
5 47 5 9 pm 01
6 6 2 11 pm 01
7 13 21 80 pm 01
uj5u.com熱心網友回復:
使用 reset_index() 時,它將舊索引添加為資料框中的列。您可以設定 drop = True 洗掉舊索引:
reset_index(drop = True)
uj5u.com熱心網友回復:
這對我來說聽起來像是一個更簡單的解決方案。
df1['Ti'] = 'am'
df2['Ti'] = 'pm'
new_def = df1.append(df2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409471.html
標籤:
