2016-07-14 44 views
3

我處理一個數據幀,它看起來像添加新列:與現有的列名

FID   geometry          Code w1 w2 
0 12776 POLYGON ((-1.350000000000025 53.61540813717482... 12776 0 1 
1 13892 POLYGON ((6.749999999999988 52.11964001623148,... 13892 1 0 
2 14942 POLYGON ((-3.058896639907732e-14 51.3958198431... 14942 1 1 
3 18964 POLYGON ((8.549999999999974 45.26941059233587,... 18964 0 1 
4 19863 POLYGON ((-0.4500000000000305 44.6337746953077... 19863 0 1 

我的目標是增加一列,標示爲「最大」,在那裏我會寫這w(w1,w2)有更多的頻率。

到目前爲止,我只管理添加一列,其中出現的最高頻率,而不是它出現的列的名稱。

所需的輸出會是這樣的:

FID  geometry  Code w1 w2 Max 
0 12776 ...   12776 0 1 w2 
1 13892 ...   13892 1 0 w1 
2 14942 ...   14942 1 1 0 
3 18964 ...   18964 0 1 w2 
4 19863 ...   19863 0 1 w2 

而且,我想,以填補零每當頻率是相同的,如果可能的話,在同一時間。

任何幫助,將不勝感激! :-)

回答

4

使用np.where當它們相等時選擇0當它們不相等時idxmax(1)

df['max'] = np.where(df.w1 == df.w2, 0, df[['w1', 'w2']].idxmax(1)) 
df 

    FID  geometry  Code w1 w2 Max 
0 12776 ...   12776 0 1 w2 
1 13892 ...   13892 1 0 w1 
2 14942 ...   14942 1 1 0 
3 18964 ...   18964 0 1 w2 
4 19863 ...   19863 0 1 w2 
+0

太棒了!它工作完美!在我有兩個以上w的情況下,有沒有辦法做到這一點?假設我有六個w ......所有w都不可能是平等的,但以防萬一...... –

4

像這樣的東西應該工作:

(df['w1'] == df['w2']).map({True: 0}).fillna(df[['w1', 'w2']].idxmax(axis=1)) 
Out[26]: 
0 w2 
1 w1 
2  0 
3 w2 
4 w2 
dtype: object 

工作原理:

主要部分是idxmax:

df[['w1', 'w2']].idxmax(axis=1) 
Out[27]: 
0 w2 
1 w1 
2 w1 
3 w2 
4 w2 
dtype: object 

這首先選擇相關的列,返回最大值的索引(對於列,軸= 1)。但是,如果出現關係,它將返回第一個索引。

(df['w1'] == df['w2']).map({True: 0})用012填充0系列w1==w2。剩餘的值是NaN。所以這些都是idxmax值。

注意:np.where絕對是更合乎邏輯(也許更快)的選擇。我只是想嘗試其他的選擇。

+0

這是一個非常聰明的方式來做到這一點,但我從來沒有想過這樣做。謝謝! –