我是python的新手。我想从网格中找到一个最大值,并在输出中显示其各自的行和列索引标签。该值应该是绝对的。 (与+或-无关) 我的数据结构如下图所示: My data set
EleNo._ Exat0_ Exat10_ Exat20_ Exat30_ Exat40_ Exat50
1000____ 10____ 20___ -30____ 23_____ 28____ 18
2536____-20___ -36___ -33___ -38_____ 2____ -10
3562_____ 3____ 4______ 8_____ 8_____ 34_____ 4
2561_____ 2____ 4______ 7_____ 6_____ 22____ 20
我尝试了(df.abs().max())
,但它显示的是每一行的最大值,并且仅显示正值。我要绝对值。
预期结果: what i want in output
EleNo.: 2536
Exat30 : -38
实际结果: what i am getting in output
Element No. 3562
Exat0: 20
Exat10: 36
Exat20: 33
Exat30: 38
Exat40: 34
Exat50: 20
答案 0 :(得分:2)
使用numpy.unravel_index
作为索引,并通过带有索引的构造函数创建DataFrame:
df = pd.DataFrame({'Exat0': [10, -20, 3, 2],
'Exat10': [20, -36, 4, 4],
'Exat20': [-30, -33, 8, 7],
'Exat30': [23, -38, 8, 6],
'Exat40': [28, 2, 34, 22],
'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
df.index.name='EleNo.'
print (df)
Exat0 Exat10 Exat20 Exat30 Exat40 Exat50
EleNo.
1000 10 20 -30 23 28 18
2536 -20 -36 -33 -38 2 -10
3562 3 4 8 8 34 4
2561 2 4 7 6 22 20
a = df.abs().values
r,c = np.unravel_index(a.argmax(), a.shape)
print (r, c)
1 3
df1 = pd.DataFrame(df.values[r, c],
columns=[df.columns.values[c]],
index=[df.index.values[r]])
df1.index.name='EleNo.'
print (df1)
Exat30
EleNo.
2536 -38
另一种只有DataFrame.abs
,DataFrame.stack
且最大值索引为Series.idxmax
的熊猫解决方案:
r1, c1 = df.abs().stack().idxmax()
最后由DataFrame.loc
选择:
df1 = df.loc[[r1], [c1]]
print (df1)
Exat30
EleNo.
2536 -38
编辑:
df = pd.DataFrame({'Exat0': [10, -20, 3, 2],
'Exat10': [20, -36, 4, 4],
'Exat20': [-30, -33, 8, 7],
'Exat30': [23, -38, 8, 6],
'Exat40': [28, 2, 34, -38],
'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
df.index.name='EleNo.'
print (df)
Exat0 Exat10 Exat20 Exat30 Exat40 Exat50
EleNo.
1000 10 20 -30 23 28 18
2536 -20 -36 -33 -38 2 -10
3562 3 4 8 8 34 4
2561 2 4 7 6 -38 20
s = df.abs().stack()
mask = s == s.max()
df1 = df.stack()[mask].unstack()
print (df1)
Exat30 Exat40
EleNo.
2536 -38.0 NaN
2561 NaN -38.0
df2 = df.stack()[mask].reset_index()
df2.columns = ['EleNo.','cols','values']
print (df2)
EleNo. cols values
0 2536 Exat30 -38
1 2561 Exat40 -38
答案 1 :(得分:1)
结合使用max()和dropna()
首先创建一个数据框:
df = pd.DataFrame(np.random.randn(4,4))
0 1 2 3
0 0.051775 0.352410 -0.451630 -0.452446
1 -1.434128 0.516264 -0.807776 -0.077892
2 1.615521 0.870604 -0.010285 -0.322280
3 -0.027598 1.046129 -0.165166 0.365150
计算两次max()以获得数据帧中的最大值,然后使用nan剪切出行和列。
result = df[df == abs(df).max().max()].dropna(axis=0, how="all").dropna(axis=1, how='all')
print(result)
0
2 1.615521
最后,获取列和行的值以及最大值。
max_value = result.values.item()
max_column = result.columns.values[0]
max_row = result.index.values[0]
print('max_value', max_value, 'max_column', max_column,'max_row', max_row)
max_value 1.615520522284493 max_column 0 max_row 2
答案 2 :(得分:1)
您的问题是您忘记告诉熊猫null
列是索引。在那之后,事情变得更简单了:仅用每行的绝对值的最大值构建一个序列,获取该系列的最大值的索引,然后使用它在原始数据帧中找到所需的行。代码可能是:
EleNo.
显示符合预期:
s = df.set_index('EleNo.').apply(np.absolute).max(axis=1)
print(df[df['EleNo.'] == s[s == s.max()].index[0]])