如何从动态列数中找到最大值

时间:2019-10-25 14:21:22

标签: python pandas dataframe

我有两个数据框: A:20 * 15的数字矩阵 B:20 * 1数字列表(从1-15开始)。

我想在表A的每一行中找到最大数目,但是只查看表B中的列

下面的简化示例。

谢谢!

+-----------------+
|       A:        |
+-----------------+
| 7  3  5  4      |
| 8  1  2  5      |
| 2  3  7  2      |
| 4  1  3  6      |


+-----------------+
|       B:        |
+-----------------+
| 2               |
| 4               |
| 1               |
| 2               |

| Desired result: |
| 7               |
| 8               |
| 2               |
| 4               |

3 个答案:

答案 0 :(得分:3)

where + max

您想在每一行的前n列中找到最大值,其中n来自第二个数据帧。因此,遮盖不重要的单元格,然后将最大值设为max会默认忽略NaN

import numpy as np

m = np.arange(dfa.shape[1]) < dfb[0][:, None]  # Thanks rafaelc
dfa.where(m).max(1)

#0    7.0
#1    8.0
#2    2.0
#3    4.0
#dtype: float64

样本数据:

dfa
   0  1  2  3
0  7  3  5  4
1  8  1  2  5
2  2  3  7  2
3  4  1  3  6

dfb
   0
0  2
1  4
2  1
3  2

答案 1 :(得分:3)

使用pd.DataFrame.wherenp.ones

m = np.ones(dfa.shape).cumsum(1)
dfa.where(m <= dfb.to_numpy()).max(1)

也可以使用

m = np.broadcast_to(np.arange(len(dfa)) + 1, dfa.shape)

0    7.0
1    8.0
2    2.0
3    4.0
dtype: float64

答案 2 :(得分:2)

pandas解决方案

S=A.stack()
S[B.reindex(S.index.get_level_values(0)).values>=S.index.get_level_values(1)].max(level=0)
Out[276]: 
0    7
1    8
2    2
3    4
dtype: int64