2015-05-19 13 views
5

2 adet veri karegim var. bir bölme İşletim sütun df2 biraz farklı hizalanacakBir Pandas Dataframe'i Başka Birine Böl - Dizini yoksay ama sütunlara saygı

df1= pd.DataFrame([[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]], 
        columns=['A','B','C','D'], index=['x','y','z']) 

df2= pd.DataFrame([[0.,1.,2.,3.]], columns=['A','B','D','C'], index=['q']) 

Not yayın istiyoruz.

Satırın yayınlandığı df1'i df2'ye bölerek sütun etiketlerine saygı duyarım.

Bu yanlış olur. Ben arzu

df1.values/df2.values 

[[   inf 2.   1.5   1.33333333] 
[   inf 6.   3.5   2.66666667] 
[   inf 10.   5.5   4.  ]] 

Cevap geçerli:

A B C  D 
x inf 2 1  2 
y inf 6 2.33 4 
z inf 10 3.66 6 

cevap

2

çalışacak:

In [75]: df1/df2.loc['q'] 
Out[75]: 
    A B   C D 
x inf 2 1.000000 2 
y inf 6 2.333333 4 
z inf 10 3.666667 6 

Tek bir satırın adını kullanmayı bilmiyorsanız/kullanmak istiyorsanız, tek sütun veri çerçevesini bir diziye dönüştürmek için squeeze kullanabilirsiniz: df1/df2.squeeze() (@EdChum'un yanıtına bakın).

+0

çok güzel ve özlü + 1 – EdChum

1

etsin, sen

In [53]: df1.values/df2[df1.columns].values 
Out[53]: 
array([[   inf, 2.  , 1.  , 2.  ], 
     [   inf, 6.  , 2.33333333, 4.  ], 
     [   inf, 10.  , 3.66666667, 6.  ]]) 
1

Ardından sütun yeniden düzenlemek ve değerlerin üzerinde bölmek sonra df1 aynı sizin df2 sütunları sipariş ve olabilir Diziyi düzleştirmek için squeeze numaralı telefonu arayın ve div:

numaralı telefonu arayın. Joris cevabı çok güzel @
In [114]: 

df1= pd.DataFrame([[1.,2.,3.,4.],[5.,6.,7.,8.],[9.,10.,11.,12.]] ,columns = ['A','B','C','D'], index = ['x','y','z']) 
df2= pd.DataFrame([[0.,1.,2.,3.]] ,columns = ['A','B','D','C'], index = ['q']) ​ 
df1.div(df2.ix[:,df1.columns].squeeze()) 

Out[114]: 
    A B   C D 
x inf 2 1.000000 2 
y inf 6 2.333333 4 
z inf 10 3.666667 6 

df1/df2.ix[:,df1.columns].squeeze() da ancak işler

DÜZENLEME pandalar doğal olarak zaten bu yüzden sütunları karşı hizaya gibi sütun yeniden sıralama gereksizdir @joris tarafından işaret

gibi:

df1.div(df2squeeze()) 

veya

df1./df2squeeze() 

istediğiniz sonucu veren, pandalar ilk dataframe sütunları Şu seriye uyumlu olur (ikinci dataframe biri satır olduğunu seçerek) bir Series tarafından bölerseniz

+0

Bana öğrettiğin için teşekkür ederim .squeeze() – Dickster

+1

@EdChum '.ix [:, df1.columns]' kısmına 'div' kullanırken, bu bölüm otomatik olarak indeksler: ''df1.div (df2.squeeze()) 'de (aynı zamanda güzel bir çözüm!) çalışır – joris

+1

@joris evet bunu overthinking, ben biraz fazla indeksleme fantezi gibi, güncelleme olacak, teşekkürler – EdChum