Pandas 最大行数,前 n 最大
Posted
技术标签:
【中文标题】Pandas 最大行数,前 n 最大【英文标题】:Pandas max for rows, top n max 【发布时间】:2020-03-11 09:43:33 【问题描述】:我正在尝试创建顶部列,这是几列行中的最大值。 Pandas 有一个方法nlargest,但我无法让它成行工作。 Pandas 也有 max 和 idxmax,它们完全符合我的要求,但仅限于绝对最大值。
df = pd.DataFrame(np.array([[1, 2, 3, 5, 1, 9], [4, 5, 6, 2, 5, 9], [7, 8, 9, 2, 5, 10]]), columns=['a', 'b', 'c', 'd', 'e', 'f'])
cols = df.columns[:-1].tolist()
df['max_1_val'] = df[cols].max(axis=1)
df['max_1_col'] = df[cols].idxmax(axis=1)
输出:
a b c d e f max_1_val max_1_col
0 1 2 3 5 1 9 5 d
1 4 5 6 2 5 9 6 c
2 7 8 9 2 5 10 9 c
但我正在尝试获取 max_n_val 和 max_n_col,因此前 3 名的预期输出为:
a b c d e f max_1_val max_1_col max_2_val max_2_col max_3_val max_3_col
0 1 2 3 5 1 9 5 d 3 c 2 b
1 4 5 6 2 5 9 6 c 5 b 5 e
2 7 8 9 2 5 10 9 c 8 b 7 a
【问题讨论】:
我没有发布作为答案,因为它不完整。但这可能会让您入门:df[['max_1', 'max_2', 'max_3']] = df.T.nlargest(3, columns=[0]).T
。基本上,您将原始帧转置为 calc nlargest
并存储到新列,然后转置回其原始形式。
【参考方案1】:
为了提高性能使用numpy.argsort
作为位置,为了正确的顺序使用最后3个项目,通过索引反转:
N = 3
a = df[cols].to_numpy().argsort()[:, :-N-1:-1]
print (a)
[[3 2 1]
[2 4 1]
[2 1 0]]
然后通过索引到c
来获取列名,并为d
中的值重新排序使用this 解决方案:
c = np.array(cols)[a]
d = df[cols].to_numpy()[np.arange(a.shape[0])[:, None], a]
最后创建DataFrame
s,通过concat
加入并通过DataFrame.reindex
重新排列列名:
df1 = pd.DataFrame(c).rename(columns=lambda x : f'max_x+1_col')
df2 = pd.DataFrame(d).rename(columns=lambda x : f'max_x+1_val')
c = df.columns.tolist() + [y for x in zip(df2.columns, df1.columns) for y in x]
df = pd.concat([df, df1, df2], axis=1).reindex(c, axis=1)
print (df)
a b c d e f max_1_val max_1_col max_2_val max_2_col max_3_val \
0 1 2 3 5 1 9 5 d 3 c 2
1 4 5 6 2 5 9 6 c 5 e 5
2 7 8 9 2 5 10 9 c 8 b 7
max_3_col
0 b
1 b
2 a
【讨论】:
我收到“AttributeError: 'DataFrame' object has no attribute 'to_numpy'”但我更新了 numpy 和 pandas @destinychoice - 那么可以将.numpy()
更改为.values
,而没有()
吗?
是的,将to_numpy()
更改为.values
效果很好,很好
必须是我的环境,因为to_numpy()
在 python shell 中工作正常以上是关于Pandas 最大行数,前 n 最大的主要内容,如果未能解决你的问题,请参考以下文章