[英]How to use a row value and a row value plus a number in a conditional statement to find the max of a column based on the grouping
[英]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
,但无法到达任何地方)
另外,如何使用rank
或sort
找到每行的前n
和后n
值(其中n > 1
)? 我尝试以下对行进行排序(降序)
df_data.values.sort
df_data = df_data.iloc[:,::-1]
这似乎可行,但我的最终目标是在列A',B',C',D'中找到值
对不起,如果有点长。
我使用了Numpy Fancy Indexing 。
第一步是确定A
, B
, C
, D
列中最大元素的索引。 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
的第一列是A
, B
, C
, D
列中按行的最小元素的索引。 也就是说, 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'
列中选择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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.