有没有办法在 Pandas Dataframe 的多个行和列中对值进行排名?
Is there a way to rank a value within multiple rows and columns in Pandas Dataframe?
所以我有一个包含 3 列和 3 行的数据框(还有更多列,但为简单起见,我们忽略它们),我想在其中添加额外的 3 列,其中包含该组中值的排名。
输入如下:
Column1 Column2 Column3
Row1 60 20 10
Row2 40 30 80
Row3 70 50 50
期望的输出是:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4
我一直在查看 dataframe.rank,但它似乎只适用于行或列,而不是合并。
用 join
和 apply
试试这个:
lst = sorted(df.values.flatten().tolist())[::-1]
print(df.join(df.apply(lambda x: [lst.index(i) + 1 for i in x]), rsuffix='_rank'))
输出:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4
import pandas as pd
import numpy as np
df = pd.DataFrame([[60,20,10], [40,30,80], [70,50,50]], columns=['Column1','Column2','Column3'])
mapped = dict(map(reversed, enumerate(np.sort(df.values.flatten())[::-1],1)))
for each_column in df.columns:
df[each_column + '_rank'] = df[each_column].map(mapped)
print(df)
# Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
# 0 60 20 10 3 8 9
# 1 40 30 80 6 7 1
# 2 70 50 50 2 5 5
您可以使用join()
+stack()
+unstack()
:
df=df.join(df.stack().rank(ascending=False).unstack().astype(int),rsuffix='_rank')
df 的输出:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4
所以我有一个包含 3 列和 3 行的数据框(还有更多列,但为简单起见,我们忽略它们),我想在其中添加额外的 3 列,其中包含该组中值的排名。
输入如下:
Column1 Column2 Column3
Row1 60 20 10
Row2 40 30 80
Row3 70 50 50
期望的输出是:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4
我一直在查看 dataframe.rank,但它似乎只适用于行或列,而不是合并。
用 join
和 apply
试试这个:
lst = sorted(df.values.flatten().tolist())[::-1]
print(df.join(df.apply(lambda x: [lst.index(i) + 1 for i in x]), rsuffix='_rank'))
输出:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4
import pandas as pd
import numpy as np
df = pd.DataFrame([[60,20,10], [40,30,80], [70,50,50]], columns=['Column1','Column2','Column3'])
mapped = dict(map(reversed, enumerate(np.sort(df.values.flatten())[::-1],1)))
for each_column in df.columns:
df[each_column + '_rank'] = df[each_column].map(mapped)
print(df)
# Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
# 0 60 20 10 3 8 9
# 1 40 30 80 6 7 1
# 2 70 50 50 2 5 5
您可以使用join()
+stack()
+unstack()
:
df=df.join(df.stack().rank(ascending=False).unstack().astype(int),rsuffix='_rank')
df 的输出:
Column1 Column2 Column3 Column1_rank Column2_rank Column3_rank
Row1 60 20 10 3 8 9
Row2 40 30 80 6 7 1
Row3 70 50 50 2 4 4