iki veri çerçevesini birleştirin ve adlarla sütun düzeyi ekleyin


9

Merhaba Pandalar için concat, join ve birleştirme yöntemlerini araştırıyorum ve istediğimi bulamıyorum.

İki veri çerçevem ​​olduğunu varsayalım

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

Şimdi sütunları birleştirilen yeni bir veri çerçevesi yapmak istiyorum, sütunları nasıl istediğim için çoklu bir dizin oluşturursam açıklamanın en kolay olduğunu düşünüyorum

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]])

Şimdi sütunlar için bu çoklu dizinle boş bir veri çerçevesi yaparsam

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     -  -     -  -     -  -

Sorum şu: Bunu elde etmek için hangi birleştirme, birleştirme veya birleştirme kullanıyorum? Concat için çok şey denedim ... iç, dış vb. İstediğimi bulamıyorum. Aklıma gelen tek şey boş veri çerçevesi yapmak ve sonra geri doldurmak.

Düzenleme: Jezrael yanıt denedikten sonra, yakın ama tam olarak değil. İstediğim iç içe sütunlar gibi mi? Örneğin

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

Veya

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

Bu benim ortaya koyduğum bir çözüm ama sütunları yinelemekten.

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

Yanıtlar:


8

Ben parametre ve , tarafından son düzey sıralama ve ilk seviyeye göre sıralama concatile ihtiyacınız olduğunu düşünüyorum :keysaxis=1DataFrame.swaplevelDataFrame.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

İle çalışmak MultiIndexmümkündür kullanımı 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

İsterseniz MultiIndex columnkullanın tuple:

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

İndeks ve sütun kullanımı ile seçim yapmak istiyorsanız loc:

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

2
Başardı! Çok teşekkür ederim!
Melendowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.