这是一个更大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
但无法到达任何地方)
另外,如何使用n
或n
在每行(n > 1
)中找到最高rank
和最低sort
值?我尝试按顺序对行进行排序(降序)
df_data.values.sort
df_data = df_data.iloc[:,::-1]
这似乎有效,但我的最终目标是找到A',B',C',D'列中的值
抱歉,如果有点长。
答案 0 :(得分:0)
第一步是确定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
的最后一列是最大元素的索引。
我们将此用于Numpy Fancy Indexing到A'
,B'
,C'
,D'
列。为此,我们使用两个数组来下标二维数组。第一个数组是行索引,第二个数组是每行中所需的列。
>>> df[["A'", "B'", "C'", "D'"]].values[np.arange(nrow), idxs[:, -1]]
由于我们使用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)