Python 对数据帧中的行进行排序并获取列ID
对于给定的熊猫数据帧,我想为最高、第二高、第三高等创建新列。。。一行中的值。然后为每个列的相应列名创建另一列。下面的代码针对行的最大值执行此操作,但后面的代码不执行此操作 改编自 这将产生:Python 对数据帧中的行进行排序并获取列ID,python,pandas,numpy,Python,Pandas,Numpy,对于给定的熊猫数据帧,我想为最高、第二高、第三高等创建新列。。。一行中的值。然后为每个列的相应列名创建另一列。下面的代码针对行的最大值执行此操作,但后面的代码不执行此操作 改编自 这将产生: A B C D E Max1 Col_Max1 0 23 12.0 1 9 123.0 123.0 E 1 24 33.0 33 343 33.0 343.0 D 2 55 0.2 66 4
A B C D E Max1 Col_Max1
0 23 12.0 1 9 123.0 123.0 E
1 24 33.0 33 343 33.0 343.0 D
2 55 0.2 66 4 2.2 66.0 C
3 77 44.0 44 64 42.0 77.0 A
4 33 23.5 5 24 2.0 33.0 A
5 66 66.0 62 63 99.0 99.0 E
Process finished with exit code 0
唯一需要注意的是,如果这关系到性能的话,可能会有大量的列。谢谢大家。使用底层阵列数据并关注性能的一种方法是-
a = df.values
c = df.columns
idx = a.argsort(1)[:,::-1]
vals = a[np.arange(idx.shape[0])[:,None], idx]
IDs = c[idx]
names_vals = ['Max'+str(i+1) for i in range(a.shape[1])]
names_IDs = ['Col_Max'+str(i+1) for i in range(a.shape[1])]
df_vals = pd.DataFrame(vals, columns=names_vals)
df_IDs = pd.DataFrame(IDs, columns=names_IDs)
df_out = pd.concat([df, df_vals, df_IDs], axis=1)
样本输入、输出-
In [40]: df
Out[40]:
A B C D E
0 23 12.0 1 9 123.0
1 24 33.0 33 343 33.0
2 55 0.2 66 4 2.2
3 77 44.0 44 64 42.0
4 33 23.5 5 24 2.0
5 66 66.0 62 63 99.0
In [41]: df_out
Out[41]:
A B C D E Max1 Max2 Max3 Max4 Max5 Col_Max1 Col_Max2 \
0 23 12.0 1 9 123.0 123.0 23.0 12.0 9.0 1.0 E A
1 24 33.0 33 343 33.0 343.0 33.0 33.0 33.0 24.0 D E
2 55 0.2 66 4 2.2 66.0 55.0 4.0 2.2 0.2 C A
3 77 44.0 44 64 42.0 77.0 64.0 44.0 44.0 42.0 A D
4 33 23.5 5 24 2.0 33.0 24.0 23.5 5.0 2.0 A D
5 66 66.0 62 63 99.0 99.0 66.0 66.0 63.0 62.0 E B
Col_Max3 Col_Max4 Col_Max5
0 B D C
1 C B A
2 D E B
3 C B E
4 B C E
5 A D C
如果您需要顺序的值和ID,我们需要修改最后几个步骤-
df0 = pd.DataFrame(np.dstack((vals, IDs)).reshape(a.shape[0],-1))
df0.columns = np.vstack((names_vals, names_IDs)).T.ravel()
df_out = pd.concat([df, df0], axis=1)
样本输出-
In [62]: df_out
Out[62]:
A B C D E Max1 Col_Max1 Max2 Col_Max2 Max3 Col_Max3 Max4 \
0 23 12.0 1 9 123.0 123 E 23 A 12 B 9
1 24 33.0 33 343 33.0 343 D 33 E 33 C 33
2 55 0.2 66 4 2.2 66 C 55 A 4 D 2.2
3 77 44.0 44 64 42.0 77 A 64 D 44 C 44
4 33 23.5 5 24 2.0 33 A 24 D 23.5 B 5
5 66 66.0 62 63 99.0 99 E 66 B 66 A 63
Col_Max4 Max5 Col_Max5
0 D 1 C
1 B 24 A
2 E 0.2 B
3 B 42 E
4 C 2 E
5 D 62 C
这看起来很棒,让我试一试。这很好用。非常感谢。我需要把所有这些逻辑再研究几次才能完全理解。另外,感谢您提供的两个不同的案例!只是一个旁注——这对于生成具有所有列和位置的完整顺序的数据帧非常有用。有效地将数据帧的大小增加了三倍。如果我只想要前3(x),我会对超过x列数的所有内容调用df_vals和df_id上的drop()。我认为使用这种方法,您仍然需要至少创建一次大型数据帧,以便有效地获得排序和标签。仍然很好。对于任何试图理解下面答案的人,我发现它被称为numpy的“花式索引”。好东西。
In [62]: df_out
Out[62]:
A B C D E Max1 Col_Max1 Max2 Col_Max2 Max3 Col_Max3 Max4 \
0 23 12.0 1 9 123.0 123 E 23 A 12 B 9
1 24 33.0 33 343 33.0 343 D 33 E 33 C 33
2 55 0.2 66 4 2.2 66 C 55 A 4 D 2.2
3 77 44.0 44 64 42.0 77 A 64 D 44 C 44
4 33 23.5 5 24 2.0 33 A 24 D 23.5 B 5
5 66 66.0 62 63 99.0 99 E 66 B 66 A 63
Col_Max4 Max5 Col_Max5
0 D 1 C
1 B 24 A
2 E 0.2 B
3 B 42 E
4 C 2 E
5 D 62 C