用表格中的值创建仅包含对角线数据的一行

问题描述

我在熊猫中有下表-

>>>index1   index2   index3   index4   index5   index6   index7
0   sig      null    null     null     null     null     null
1   null      sig     null     null     null     null     null
2   null      null    sig      null     null     null     null
3   null      null    null     sig      null     null     null
4   null      null    null     null     no sig   null     null
5   null      null    null     null     null     no sig   null
6   null      null    null     null     null     null     sig

我想摆脱减少null值的问题,并将数据放在这样的一行中:

>>>index1   index2   index3   index4   index5   index6   index7
0   sig      sig     sig      sig      no sig   no sig   sig

很重要的一点是,如果使用statemnt,我将获得具有空数据的第一个表;我已经为每个索引计算了统计检验,并根据p值,使用append给出了sig或没有sig的每个索引值:

for i in indices:
    stat,p = friedmanchisquare(df[1][i],df[2][i],df[3][i],df[4][i],df[5][i])
    #print(i,p)
    if p<0.05:
        friedman=friedman.append({i:'sig'},ignore_index=True)
    else:
        friedman=friedman.append({i:'no sig'},ignore_index=True)

因此,我相信附加文件会创建包含许多空值的大表。

我的最终目标:在循环阶段中获取一张表(例如,使用除append之外的其他内容),或者在大表之后“修复”以获得一张表

解决方法

您可以尝试返回np.diagonal个元素的diagonal

d = pd.DataFrame([np.diagonal(df)],columns=df.columns)

  index1 index2 index3 index4  index5  index6 index7
0    sig    sig    sig    sig  no sig  no sig    sig
,

IIUC,使用pandas.DataFrame.bfill

new_df = df.bfill().head(1)
print(new_df)

输出:

  index1 index2 index3 index4  index5  index6 index7
0    sig    sig    sig    sig  no sig  no sig    sig
,

使用stackdroplevel的另一个选择;

df.stack().droplevel(0).to_frame().T

  index1 index2 index3 index4  index5  index6 index7
0    sig    sig    sig    sig  no sig  no sig    sig
,

np.diagonal的熊猫解决方案是df.lookup

df_diag = pd.DataFrame([df.lookup(df.index,df.columns)],columns=df.columns)

Out[47]:
  index1 index2 index3 index4  index5  index6 index7
0    sig    sig    sig    sig  no-sig  no-sig    sig