首页 > 解决方案 > 堆叠数据框和排名

问题描述

在问题中找不到我需要的东西,如果我错了,请纠正我。我有许多形状相似且可能包含 nans 的 dfs。假设不包含 nans 的 df 如下所示:

np.random.seed(1)
mat = lambda: np.random.normal(size=10).reshape((5, 2))
df1 = pd.DataFrame(mat())
df2 = pd.DataFrame(mat())
df3 = pd.DataFrame(mat())

我想以某种方式将df1,df2和堆叠df3在一起。然后跨df1, df2, df3(即堆栈级别)对每个值进行排名。

因此,在这种情况下,单个 dfs 将如下所示:

df1

在此处输入图像描述

df2

在此处输入图像描述

df3

在此处输入图像描述

所以在这种情况下,在 " .iloc[0, 0]" 我们有值:1.62、1.46 和 -1.1,所以排名df1将具有 value 3df2将具有 value2并将df3具有 value 1。然后对跨数据帧级别的每个值执行此排名。一般情况下,大约有 16 个数据帧堆叠在一起,只有 5 个等级,当有 nan 时,df 的等级为 0。

标签: pythonpandasdataframe

解决方案


我认为您concat需要GroupBy.rank

df1.loc[0,1] = np.nan

df = pd.concat([df1, df2, df3], keys=('df1','df2','df3')).groupby(level=1).rank().fillna(0)
print (df)
         0    1
df1 0  3.0  0.0
    1  1.0  1.0
    2  1.0  1.0
    3  3.0  3.0
    4  3.0  1.0
df2 0  2.0  1.0
    1  2.0  2.0
    2  3.0  2.0
    3  1.0  2.0
    4  2.0  3.0
df3 0  1.0  2.0
    1  3.0  3.0
    2  2.0  3.0
    3  2.0  1.0
    4  1.0  2.0

推荐阅读