如何将pandas堆栈更改为单行panderframe

ajsxfq5m  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(91)

我可能需要扩展我的问题...
我有一些相关矩阵可以使用(见下面的例子,但是想想几千个“Ref”列。

Ref_1          Ref_2
Base_1        0.021088       0.022260   
Base_2        0.022539       0.023792   
Base_3        0.026193       0.027648   
Base_4        0.027209       0.028721   
Base_5        0.000000       0.000000   
Base_6        0.000000       0.000000

字符串
我用以下代码提取了Top Values:

data = []

for row_index, row in similarity_df.iterrows():
    max_sim = row.max()
    max_sim_col = row.idxmax()
    data.append([row_index, max_sim_col, max_sim])

result_df = pd.DataFrame(data, columns=['Base', 'Ref', 'Score'])


一切正常,工作正常。

Base       Ref      Score
Base_1     Ref_2    0.022260
Base_2     Ref_2    0.023792


但是我需要提取每个Base的“Top10”Ref值,并使它们在一个框架或类似的东西中可读。

Base       1_Ref    1_Score     2_Ref    2_Score     3_Ref   3_Score    etc...
Base_1     Ref_2    0.022260    Ref_1    0.021088    ...
Base_2     Ref_2    0.023792    Ref_1    0.022539    ...


我尝试了堆叠,但没有得到预期的结果。有什么想法吗?

bnlyeluc

bnlyeluc1#

您可以stacksort_values,然后使用pivotgroupby.cumcount进行整形:

N = 10

out = (df
   .rename_axis(columns='Ref')
   .stack().sort_values(ascending=False)
   .reset_index(name='Score')
  # .groupby(level=0).head(N)
   .assign(n=lambda d: d.groupby('level_0').cumcount()+1)
   .pivot(index='level_0', columns='n')
   .sort_index(level='n', axis=1)
   .rename_axis(index=None)
)

out.columns = out.columns.map(lambda x: f'{x[1]}_{x[0]}')

字符串

  • 注意:要限制顶部值的数量,请取消注解.groupby(level=0).head(N)行。*

输出量:

1_Ref   1_Score  2_Ref   2_Score
Base_1  Ref_2  0.022260  Ref_1  0.021088
Base_2  Ref_2  0.023792  Ref_1  0.022539
Base_3  Ref_2  0.027648  Ref_1  0.026193
Base_4  Ref_2  0.028721  Ref_1  0.027209
Base_5  Ref_1  0.000000  Ref_2  0.000000
Base_6  Ref_1  0.000000  Ref_2  0.000000

相关问题