2017-03-23 15 views
1

私はパンダには新しく、自分の問題に取り組む方法についてのご意見をお待ちしています。私は、すぐに列AとBの値がで同じであるようである必要があり、列AとBの論理で行の値に基づいて、それを変換する必要がパンダは前の行に応じて値を置き換えます

df = pd.DataFrame({'A' : ["me","you","you","me","me","me","me"], 
       'B' : ["Y","X","X","X","X","X","Z"], 
       'C' : ["1","2","3","4","5","6","7"] 
       }) 

:私は、次のデータフレームを持っていますこのシーケンスの最初の行は維持する必要がありますが、次の行は列Bに 'A'を設定する必要があります。

例:列AとBの値は行1と2で同じです。 B列2行をAと置き換える必要があります。これは私の予想される出力です:

df2= pd.DataFrame({'A' : ["me","you","you","me","me","me","me"], 
       'B' : ["Y","X","A","X","A","A","Z"], 
       'C' : ["1","2","3","4","5","6","7"]}) 

答えて

2

第1の和列AB

a = df.A + df.B 

は、次にシフトバージョンとの比較:

print (a != a.shift()) 
0  True 
1  True 
2 False 
3  True 
4 False 
5 False 
6  True 
dtype: bool 

cumsumでユニークなグループを作成します。

print ((a != a.shift()).cumsum()) 
0 1 
1 2 
2 2 
3 3 
4 3 
5 3 
6 4 
dtype: int32 

は値が重複しているブールマスクを取得します。

print ((a != a.shift()).cumsum().duplicated()) 
0 False 
1 False 
2  True 
3 False 
4  True 
5  True 
6 False 
dtype: bool 
True値を置き換えるための

ソリューション:

df.loc[(a != a.shift()).cumsum().duplicated(), 'B'] = 'A' 
print (df) 
    A B C 
0 me Y 1 
1 you X 2 
2 you A 3 
3 me X 4 
4 me A 5 
5 me A 6 
6 me Z 7 

df.B = df.B.mask((a != a.shift()).cumsum().duplicated(), 'A') 
print (df) 
    A B C 
0 me Y 1 
1 you X 2 
2 you A 3 
3 me X 4 
4 me A 5 
5 me A 6 
6 me Z 7 

print (df2.equals(df)) 
True 
+0

おかげで非常に多く、それは完璧です。 –

関連する問題