Экспорт списка в виде нового столбца во фрейме данных pandas как части вложенного цикла for

#python-3.x #pandas #for-loop #nested-loops

#python-3.x #pandas #цикл for #вложенные циклы

Вопрос:

Я ввожу несколько электронных таблиц с несколькими столбцами данных. Для каждой электронной таблицы найдено максимальное значение каждого столбца. Затем для каждого элемента в столбце элемент делится на максимальное значение этого столбца. Выводом должно быть значение (от 0 до 1) для каждого элемента в столбце в порядке возрастания. Это добавляется к списку, который должен быть добавлен в исходную электронную таблицу в виде столбца.

Насколько я понимаю, в настоящее время вложенные циклы выполняются корректно, за исключением последнего шага. Каждый столбец добавляется в электронную таблицу, ЗА исключением значений, относящихся к последнему столбцу исходной электронной таблицы, а не к значениям, относящимся к каждому отдельному столбцу.

Я попытался изменить отступы, чтобы связать уровни кода с разными частями (поскольку я думаю, что это проблема) и попытался переместить добавленный столбец в фрейме данных, но безрезультатно.

for i in distlist:
#listname = i[4:] '_norm'
df2 = pd.read_excel(i,header=0,index_col=None, skip_blank_lines=True)
df3 = df2.dropna(axis=0, how='any')

 cols = []
for column in df3:
    cols.append(column)

    for x in cols:
        listname = x   ' norm'
        maxval = df3[x].max()
        print(maxval)
        mylist = []

        for j in df3[x]:
            findNL = (j/maxval)
            mylist.append(findNL)
        df3[listname] = mylist


        saveloc = 'E:/test/'  
        filename = i[:-18]   '_Normalised.xlsx'
        df3.to_excel(saveloc filename, index=False) 
  

В выходной фрейм данных добавляются новые столбцы с пользовательскими заголовками, относящимися к заголовкам полей в исходной электронной таблице, и переименовываются в соответствии с (listname). Данные в каждом из этих новых столбцов идентичны и относятся к последнему столбцу в электронной таблице. Мне кажется, что он каждый раз перезаписывает значения (как будто перебирает всю электронную таблицу, а не выводит для каждого столбца) и добавляет его в электронную таблицу.

Любая помощь была бы высоко оценена. Я думаю, это что-то простое, но мне не удалось выяснить, что именно…

Ответ №1:

Если я вас правильно понимаю, вы все усложняете. Для этого вам не нужен цикл for. Вы можете упростить свой код:

 # Make example dataframe, this is not provided
df = pd.DataFrame({'col1':[1, 2, 3, 4],
                  'col2':[5, 6, 7, 8]})

print(df)
   col1  col2
0     1     5
1     2     6
2     3     7
3     4     8
  

Теперь мы можем использовать DataFrame.apply и use add_suffix для присвоения новым столбцам _norm суффикса и после этого объединить столбцы в один конечный фрейм данных

 df_conc = pd.concat([df, df.apply(lambda x: x/x.max()).add_suffix('_norm')],axis=1)

print(df_conc)
   col1  col2  col1_norm  col2_norm
0     1     5       0.25      0.625
1     2     6       0.50      0.750
2     3     7       0.75      0.875
3     4     8       1.00      1.000
  

Ответ №2:

Большое спасибо. Я думаю, что я просто слишком усложнил это. Кстати, я думаю, что мой код может выполнять ту же работу, но поскольку разница в значениях так мала, это не было заметно.

Спасибо за вашу помощь @Erfan