使用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