根据行max定位条件列值

时间:2018-02-02 23:56:44

标签: python pandas sorting dataframe row

这是一个更大df_data 1000 x 150

的简单版本
Date            A   B   C   D        A'  B' C'  D'
31/01/2017      47  15  45  40       10  7  12   8
28/02/2017      22  34  28  13        3  2  26   4
31/03/2017      25  12  13  47        1  5   6  59

基本问题是需要排列A,B,C,D行,并使用最大/最小标准在A',B',C',D'列中找到相应的行值

需要关注。

(1)找到每个日期(行)的n个最高值和n个最低值。 我们假设这里n = 2。 (2)条件来自(1)的最小值/最大值使用相关列标题来查找与A',B,C',D'不同的列在同一行中的对应值 (在相同的df或不同的df中具有完全相同的日期索引)

假设A,B,C,D与A',B',C',D'之间存在1-1映射

期望的结果:

31/01/2017: max1 = 10, max2 =12 ; min1 = 7, min2 = 8
28/02/2017: max1 =  2, max2 =26 ; min1 = 4, min2 = 3
31/03/2017: max1 = 59, max2 = 1 ; min1 = 5, min2 = 6

我可以使用

找到最大值
df_data [["A","B","C","D"]].apply(lambda row: np.max(row),axis=1)

但是如何在iloc或其他方式中使用.apply函数来查找该最大值的col标头(索引)? (我在.argsort数组中尝试过numpy但无法到达任何地方)

另外,如何使用nn在每行(n > 1)中找到最高rank和最低sort值?我尝试按顺序对行进行排序(降序)

df_data.values.sort
df_data = df_data.iloc[:,::-1]

这似乎有效,但我的最终目标是找到A',B',C',D'列中的值

抱歉,如果有点长。

1 个答案:

答案 0 :(得分:0)

我使用Numpy Fancy Indexing

第一步是确定ABCD列中最大元素的索引。 np.argmax可行,但您提到要查找最小,第二大,第二小等,请使用np.argsort

>>> idxs = df['A B C D'.split()].apply(np.argsort, axis=1).values

在您的示例中idxs是:

array([[1, 3, 2, 0],
       [3, 0, 2, 1],
       [1, 2, 0, 3]], dtype=int64)

idxs的第一列是ABCD列中最小元素的索引。也就是说,df.iloc[0, 1]是15,是第一行中的最小元素。 df.iloc[1, 3]是13,是第二行中的最小元素。等idxs的第二列是第二列的索引。 idxs的最后一列是最大元素的索引。

我们将此用于Numpy Fancy Indexing到A'B'C'D'列。为此,我们使用两个数组来下标二维数组。第一个数组是行索引,第二个数组是每行中所需的列。

>>> df[["A'", "B'", "C'", "D'"]].values[np.arange(nrow), idxs[:, -1]]

由于我们使用idxs的最后一列,因此我们选择列ABCD中最大项的索引来自A'B'C'D'列。结果是

array(['10', '2', '59'], dtype=object)

根据需要。

选择与最小用途相对应的元素

>>> df[["A'", "B'", "C'", "D'"]].values[np.arange(nrow), idxs[:, 0]]
array(['7', '4', '5'], dtype=object)