Select pandas DataFrame 中每一行的非空列

Select non-null columns for each row in a pandas DataFrame

我有一个数据框,其中行是不同的情况,列是可能的事件,形式为:

df_prob
index  colA colB colC ColD
  0     NaN  0.9  NaN  0.1
  1     NaN  NaN  0.3  0.7
  2       1  NaN  NaN  NaN

我需要构建一个 df,其中列出每个案例以及该案例的可能事件:

df_order
index case event prob
  0    0    colB  0.9
  1    0    colD  0.7
  2    1    colC  0.3
  3    1    colD  0.7
  4    2    colA   1


增加的困难是它是一个非常分散的矩阵,所以它的大部分值都是 NAN,我一直试图找到一些不使用循环的方法,因为它的 df 大约为 30000 x 30000。

使用stack然后重置索引:

(df.set_index('index')
   .stack()
   .reset_index()
   .set_axis(['case', 'event', 'prob'], axis=1, inplace=False))

   case event  prob
0     0  colB   0.9
1     0  ColD   0.1
2     1  colC   0.3
3     1  ColD   0.7
4     2  colA   1.0