2017-06-29 47 views
0

我有這樣的數據幀: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 

我要在以下以取代B列的值:

對於A列中的每個唯一值,如果COLB包含值X,然後將所有colB值替換爲「X」,即用列X的每組值替換所有值'nm'。

如果列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 

我試圖做到這一點使用GROUP BY的和計數其出現在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對分組的DataFrame有兩個主要操作:聚合和轉換。聚合會爲每個組生成一個值。例如,如果按性別分組,則可以計算男性和女性的平均體重。最後你有兩個數據點:男性的平均體重和女性的平均體重。現在假設每個人都想計算他們的權重和平均體重之間的差異。這仍然使用聚合值,但也會轉換Series中每個單獨的數據點。 – ayhan

+0

所以,如果你想最終得到每個組的單個值,你可以使用groupby.agg,但是如果你想根據關於他們組的一些特性來改變每個觀察結果,你應該使用groupby.transform。在這個例子中,我們遵循相同的兩個步驟:1)組中是否包含'X'(聚合 - 返回一個值爲True或False)2)如果爲True,則將所有值更改爲X(轉換) – ayhan