hợp nhất hai datafram và thêm cấp cột với tên


9

Xin chào, tôi đã đào sâu vào concat, tham gia và hợp nhất các phương pháp cho gấu trúc và dường như không thể tìm thấy những gì tôi muốn.

Giả sử tôi có hai datafram

A = pd.DataFrame("A",index=[0,1,2,3,4],columns=['Col 1','Col 2','Col 3'])
B = pd.DataFrame("B",index=[0,1,2,3,4],columns=['Col 1','Col 2','Col 3'])
>>> A
  Col 1 Col 2 Col 3
0     A     A     A
1     A     A     A
2     A     A     A
3     A     A     A
4     A     A     A
>>> B
  Col 1 Col 2 Col 3
0     B     B     B
1     B     B     B
2     B     B     B
3     B     B     B
4     B     B     B

Bây giờ tôi muốn tạo một khung dữ liệu mới với các cột được hợp nhất, tôi nghĩ nó dễ giải thích nhất nếu tôi tạo một chỉ mục đa cho cách tôi muốn các cột

index = pd.MultiIndex.from_product([A.columns.values,['A','B']])
>>> index
MultiIndex(levels=[['Col 1', 'Col 2', 'Col 3'], ['A', 'B']],
           labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

Bây giờ nếu tôi tạo một khung dữ liệu trống với chỉ mục đa này cho các cột

empty_df = pd.DataFrame('-',index=A.index,columns=index)
>>> empty_df
  Col 1    Col 2    Col 3
      A  B     A  B     A  B
0     -  -     -  -     -  -
1     -  -     -  -     -  -
2     -  -     -  -     -  -
3     -  -     -  -     -  -
4     -  -     -  -     -  -

Câu hỏi của tôi là, tôi sử dụng hợp nhất, concat hoặc tham gia nào để có được điều đó? Tôi đã thử nhiều thứ cho concat ... bên trong, bên ngoài, v.v. Tôi dường như không thể tìm thấy những gì tôi muốn. Điều duy nhất tôi có thể nghĩ đến là tạo ra khung dữ liệu trống và sau đó điền lại.

Chỉnh sửa: Sau khi thử phản ứng của Jezrael, nó gần nhưng không chính xác. Những gì tôi muốn giống như các cột sắp xếp lồng nhau? Ví dụ

empty_df['Col 1']
>>> empty_df['Col 1']
   A  B
0  -  -
1  -  -
2  -  -
3  -  -
4  -  -

Hoặc là

>>> empty_df['Col 1']['A']
0    -
1    -
2    -
3    -
4    -
Name: A, dtype: object

Vì vậy, đây là một giải pháp tôi đã đưa ra nhưng nó không lặp lại qua các cột.

row_idx = A.index.union(B.index)
col_idx = pd.MultiIndex.from_product([A.columns.values,['A','B']])
new_df = pd.DataFrame('-',index=row_idx,columns=col_idx)
for column in A.columns:
   new_df.loc[:,(column,'A')] = A[column]
   new_df.loc[:,(column,'B')] = B[column]
>>> new_df
  Col 1    Col 2    Col 3
      A  B     A  B     A  B
0     A  B     A  B     A  B
1     A  B     A  B     A  B
2     A  B     A  B     A  B
3     A  B     A  B     A  B
4     A  B     A  B     A  B
>>> new_df['Col 1']
   A  B
0  A  B
1  A  B
2  A  B
3  A  B
4  A  B
>>> new_df['Col 1']['A']
0    A
1    A
2    A
3    A
4    A
Name: A, dtype: object

Câu trả lời:


8

Tôi nghĩ bạn cần concatvới keystham số và axis=1, thứ tự thay đổi cuối cùng của các cấp theo DataFrame.swaplevelvà sắp xếp theo cấp đầu tiên theo DataFrame.sort_index:

df1 = (pd.concat([A, B], axis=1, keys=('A','B'))
         .swaplevel(0,1, axis=1)
         .sort_index(axis=1, level=0))
print (df1)
  Col 1    Col 2    Col 3   
      A  B     A  B     A  B
0     A  B     A  B     A  B
1     A  B     A  B     A  B
2     A  B     A  B     A  B
3     A  B     A  B     A  B
4     A  B     A  B     A  B

Để làm việc với MultiIndexcó thể sử dụng DataFrame.xs:

print (df1.xs('Col 1', axis=1, level=0))
   A  B
0  A  B
1  A  B
2  A  B
3  A  B
4  A  B

Nếu muốn chọn MultiIndex columnsử dụng tuple:

print (df1[('Col 1', 'A')])
0    A
1    A
2    A
3    A
4    A
Name: (Col 1, A), dtype: object

Nếu muốn chọn theo chỉ mục và theo cột sử dụng loc:

print (df1.loc[4, ('Col 1', 'A')])
A

2
Điều đó đã làm nó! Cảm ơn rât nhiều!
Melendowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.