我处理的数据框如下:
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
我的目标是添加一个标记为' Max'的列,我将写入哪个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
此外,我想在频率相同的情况下(如果可能的话)同时填充零。
任何帮助将不胜感激! : - )
答案 0 :(得分:5)
如果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
。
{{1}}
答案 1 :(得分: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})
在w1==w2
时填充0系列。剩余的值是NaN。所以这些都充满了idxmax值。
注意:np.where
绝对是更合乎逻辑(也可能更快)的选择。我只想尝试其他替代方案。