繁体   English   中英

根据行最大值定位条件列值

[英]locate conditional column value based on row max

这是更大的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)

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

另外,如何使用ranksort找到每行的前n和后n值(其中n > 1 )? 我尝试以下对行进行排序(降序)

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

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

对不起,如果有点长。

我使用了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第二个的索引。 idxs的最后一列是最大元素的索引。

我们用它来在A'B'C'D'列中建立大量的花式索引。 为此,我们使用两个数组对二维数组进行下标。 第一个数组是行索引,第二个数组是每行中所需的列。

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

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

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

如预期的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM