Создайте одну строку со значениями из таблицы с данными только по диагонали

#python #pandas #if-statement #null #append

#python #pandas #if-оператор #null #добавить

Вопрос:

У меня есть следующая таблица в pandas-

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

Я хотел бы избавиться от уменьшения нулевых значений и разместить данные в одной строке следующим образом:

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

Важно сказать, что я получаю первую таблицу с нулевыми данными с помощью if statemnt; Я рассчитал статистический тест для каждого индекса и на основе значения p присваиваю каждому индексу значение sig или без sig, используя append:

 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)
  

Итак, я считаю, что добавление создает большую таблицу со многими нулевыми значениями.

Моя конечная цель: получить таблицу с одной строкой либо на этапе цикла (например, использовать что-то еще, кроме добавления?), Либо «исправить» большую таблицу после, чтобы получить одну строку

Ответ №1:

Вы можете попробовать, 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
  

Ответ №2:

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
  

Ответ №3:

Другой вариант с stack , и droplevel ;

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

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

Ответ №4:

Решение pandas для 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