2017-11-14 28 views
2

私はPython 3.6.1を使用します。ここで私は値を操作したい私のデータフレームmyDFです:あなたが見ることができるようにPythonの条件に基づいてデータフレームの値を2レベルの列に置き換えるにはどうすればよいですか?

a  b   c  
    a X1 X2 X1 X2 
0 10 .  o o  o 
1 20 .  o o  o 
2 30 .  o o  o 

があります列「A」、「B」、レベル0の「C」、および列の「A」があり、 'X1'、 'X2'をレベル1に設定します。

X1の値がb2/cのX2の対応する値と等しいかどうかを比較する必要があります。したがって、上記のデータフレーム上の操作はこれを返す必要があります:

import numpy 
import pandas 

X1 = pandas.DataFrame(data=[[10,'.','o'],[20,'.','o'],[30,'.','o']], 
         columns=['a','b','c']) 
X2 = pandas.DataFrame(data=[[10,'o','o'],[20,'o','o'],[30,'o','o']], 
         columns=['a','b','c']) 

myDF = pandas.concat([X1.set_index('a'), X2.set_index('a')], 
        axis='columns', keys=['X1','X2']) 
myDF = myDF.swaplevel(axis='columns')[X1.columns[1:]] 
myDF = myDF.reset_index(col_level=1, col_fill='a') 

私がこれまで試してみましたどのようなものです::

other = myDF.xs('X1', axis=1, level=-1) 
main = numpy.where(myDF.eq(other, level=0), 'x', 'y') 
pandas.DataFrame(main, index=myDF.index, columns=myDF.columns) 

a  b   c  
    a X1 X2 X1 X2 
0 10 .  o   
1 20 .  o   
2 30 .  o   

これはどのようにソースデータフレームを取得します

これは:

a b   c  
    a X1 X2 X1 X2 
0 F T  F T  T 
1 F T  F T  T 
2 F T  F T  T 

そして前進する方法がわかりません...

答えて

2

私の全目標は、2つの列、['X1', 'X2']を持つ一時的なデータフレームを作成して、それらが等しい場所の行をマスクすることです。これにより、2つの列が得られます。

myDF.set_index(('a', 'a')).stack(0) 

     X1 X2 
(a, a)   
10  b . o 
     c o o 
20  b . o 
     c o o 
30  b . o 
     c o o 

これを一時名に保存して、いくつかの追加行を操作できます。または、pipeに沿ってタスクを実行できます。

myDF.set_index(('a', 'a')).stack(0).pipe(
    lambda d: d.mask(d.X1 == d.X2, '') 
) 

     X1 X2 
(a, a)   
10  b . o 
     c  
20  b . o 
     c  
30  b . o 
     c  

残りは、物事を元の場所に戻すための会計処理です。

myDF.set_index(('a', 'a')).stack(0).pipe(
    lambda d: d.mask(d.X1 == d.X2, '') 
).unstack().swaplevel(0, 1, 1).sort_index(1).reset_index() 

    a b  c 
    a X1 X2 X1 X2 
0 10 . o  
1 20 . o  
2 30 . o  
+1

良い解決策:-)決して前にパイプを見たことはありません:-) – Wen

+0

ありがとうございます。 – piRSquared

+0

本当にありがとうございます:)それはどのように動作するかを理解する必要があります。それでも、これが私の必要なものです。ちょうど発言:私は 'set_index(( '' a))'を使用するので、データフレームは期待どおりに見えます: –

関連する問題