这是我的尝试。例如
df = pd.DataFrame({'a':[5,0,1,np.nan], 'b':[np.nan,1,4,3], 'c':[-3,-2,0,0]})
df.dropna(axis=1).max(axis=1,key=abs)
虽然过滤掉了NaN
值,但是得到了绝对值最高的0或负数代替。
结果应该是一个列。
5
-2
4
3
这是我的尝试。例如
df = pd.DataFrame({'a':[5,0,1,np.nan], 'b':[np.nan,1,4,3], 'c':[-3,-2,0,0]})
df.dropna(axis=1).max(axis=1,key=abs)
虽然过滤掉了NaN
值,但是得到了绝对值最高的0或负数代替。
结果应该是一个列。
5
-2
4
3
我解决了它。
maxCol=lambda x: max(x.min(), x.max(), key=abs)
df.apply(maxCol,axis=1)
min()
替换 max()
,它应该可以工作。 - Brendandf.idxmax()
来获取最大值的索引,然后使用这些索引来选择原始数据框中的原始值。这种方法应该仍然优于任何应用操作。 - Brendannp.nanargmax
:>>> df.values[range(df.shape[0]),np.nanargmax(df**2,axis=1)]
array([ 5., -2., 4., 3.])
df = df.fillna(0)
l = df.abs().values.argmax(axis=1)
pd.Series([df.values[i][l[i]] for i in range(len(df.values))])
In [532]: pd.Series([df.values[i][l[i]] for i in range(len(df.values))])
Out[532]:
0 5
1 -2
2 4
3 3
dtype: float64
pd.Series([df.values[i][df.fillna(0).abs().values.argmax(axis=1)[i]] for i in range(len(df.values))])
由于我的声望分数较低,我想在 gis20 的回答和 Andrew Hamel 的问题中添加关于绝对最小值的内容:
minCol=lambda x: min(x, key=abs)
minCol=lambda x: min([abs(value) for value in x])
对于我的数据来说是有效的,但是它无法处理 np.nan。
dropna
操作时,所有带有NaN
值的列都将被丢弃,只剩下c
列。 - Anton Protopopov