微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我在熊猫中有下表-

>>>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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。