#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