2017-06-29 12 views
0

に基づいて列変更:私は、次の列Bの値を置き換えたいPythonは私がこのデータフレーム持っている他の値

x = pd.DataFrame({'colA':['A','A','A','B','C','C'], 'colB':['X','nm','X','nm','nm','nm']}) 

x 
Out[254]: 
    colA colB 
0 A X 
1 A nm 
2 A X 
3 B nm 
4 C nm 
5 C nm 

を:列Aの各固有の値については

、COLBに値が含まれている場合Xの場合、すべてのcolB値を「X」に置き換えます。つまり、列Aの値の各グループについて、すべての値「nm」をXで置き換えます。

列Aのグループ(この例では値 'C'列Bに 'X'の値を入れておかないと、 'nm'だけを残してください。

結果は次のようになります。

Out[254]: 
    colA colB 
0 A X 
1 A X 
2 A X 
3 B nm 
4 C nm 
5 C nm 

私はのことで、この使用してグループを行うことを試み、列Aの各一意の値で表示されますが、私はそれは非常に複雑だと感じ、「X」の値の数をカウントしています。より簡単な方法があると願っています。

答えて

2

あなたはgroupby.transformでそれを行うことができます。

x.groupby('colA')['colB'].transform(lambda col: 'X' if 'X' in col.values else 'nm') 
Out: 
0  X 
1  X 
2  X 
3 nm 
4 nm 
5 nm 
Name: colB, dtype: object 

は戻ってそれを割り当てる:

x['colB'] = x.groupby('colA')['colB'].transform(lambda col: 'X' if 'X' in col.values else 'nm') 

x 
Out: 
    colA colB 
0 A X 
1 A X 
2 A X 
3 B nm 
4 C nm 
5 C nm 
+0

あなたはどのようにここで働いている変換にいくつかのより多くの情報を記入してくださいだろうか?そのような小さなドキュメンテーションがあり、あなたはすぐに結論に来たようです。私は今2時間捜して、それが何をしているのか完全に理解しているとは思わない。 – user33484

+0

@ user33484グループ化されたDataFramesには、集約と変換の2つの主要な操作があります。集計は、グループごとに単一の値を生成します。たとえば、性別でグループ化すると、男性と女性の平均体重を計算できます。最後に、男性の平均体重と女性の平均体重という2つのデータポイントがあります。ここで、各個人について、その重みと平均重みの差を計算したいとします。これは、集計された値を使用しますが、Seriesの個々のデータポイントも変換します。 – ayhan

+0

したがって、グループごとに単一の値にしたい場合は、groupby.aggを使用できますが、グループに関するいくつかの特性に基づいて各観測値を変更する場合は、groupby.transformを使用する必要があります。 1)グループに 'X'が含まれていますか(集計 - TrueまたはFalseのいずれかの値を返します)2)Trueの場合はすべての値をX(変換)に変更します – ayhan

関連する問題