Экспорт списка в виде нового столбца в кадре данных pandas как часть вложенного цикла for - PullRequest
0 голосов
/ 28 марта 2019

Я ввожу несколько таблиц с несколькими столбцами данных. Для каждой электронной таблицы найдено максимальное значение каждого столбца. Затем для каждого элемента в столбце этот элемент делится на максимальное значение этого столбца. Выходными данными должно быть значение (от 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). Данные в каждом из этих новых столбцов идентичны и относятся к последнему столбцу электронной таблицы. Мне кажется, что он каждый раз перезаписывает значения (как если бы они проходили по всей электронной таблице, а не выводили для каждого столбца) и добавлял ее в электронную таблицу.

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

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

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

0 голосов
/ 28 марта 2019

Если я вас правильно понимаю, вы слишком усложняете вещи. Для этого вам не нужен цикл 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 и 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
...