在问题中找不到我所需要的,如果我错了,请纠正我。我有许多形状相似的df,其中可能包含nan。假设不包含nan的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
(即堆栈级别)上。
在这种情况下,各个df看起来像:
df1
df2
df3
因此,在这种情况下,“ .iloc[0, 0]
”中的值是:1.62、1.46和-1.1,因此排名df1
的值将是3
,df2
将具有值2
和df3
将具有值1
。然后对数据框级别上的每个值执行此排名。一般情况下,大约有16个数据帧彼此堆叠,只有5个等级,当存在nan时,df的等级为0。
答案 0 :(得分:1)
我认为您需要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