Перемещение значений в pandas df в новый столбец в df, переименуйте столбец на основе строки в столбце

У меня есть pandas df данных, извлеченных из PDF-файла. Я уже проделал немало усилий, чтобы довести дело до этого момента. Имеется около 100 химических концентраций примерно на 10 объектах, и в отдельных строках приведены лабораторные записи для каждого из них, обозначающие данные испытаний, соответствующих каждому объекту. Я хотел бы добавить единицу измерения (различные единицы) в имя столбца и переместить лабораторную заметку (в примере a,b,c,d,e различаются в моих данных) в строку для соответствующего местоположения. Пожалуйста, смотрите изображение ниже.

текущий макет df и желаемый макет df

Раньше лабораторная заметка находилась в строке непосредственно под соответствующим лабораторным тестом - после внешнего соединения с df координат испытательных площадок она была переупорядочена, как показано в опубликованном мной примере.

У меня нет опыта работы с циклами, и мне определенно нужно решение для цикла из-за количества столбцов в моих данных.

Спасибо.

Попытка добавить единицу измерения к имени столбца, используя

df.rename(columns = {'chem1': 'chem1'+df.chem1.iloc(индекс строки единиц), повторять до бесконечности}, inplace=True)

Не знаю, с чего начать с циклов для любой проблемы

Изображения данных недоступны и не воспроизводимы. Вы должны предоставить минимально воспроизводимый пример (в виде текста или, лучше, в виде кода), чтобы иметь возможность настроить свой пример.

mozway 01.08.2024 18:42
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать iloc для разделения строк, а затем

StartColumns = df.columns
newColumns = df.iloc[5:10, 3:]
NewColumnNames = [StartColumns[i] + "_LQ" for i in range(3, len(StartColumns))]
newColumns.columns = NewColumnNames
# Don't change the first 3 column names
ColNames = [StartColumns[i] if i < 3 else "_".join(StartColumns[i], df.iat[10, i]) for i in range(len(StartColumns))]
df.columns = ColNames
FinalDf = pd.concat(df, newColumns, ignore_index = True, axis = 1)

Затем, чтобы изменить порядок столбцов, вам нужно будет использовать что-то вроде

AllCols = ColNames[:3]
for i in range(2 * len(NewColumnNames)):
    # Integer division truncates, so we can take the first relevant index 
    # from our renamed columns, then the first from our new columns
    if i % 2 == 0:
        AllCols.append(ColNames[3 + int(i/2)])
    else:
        AllCols.append(NewColumnNames[int(i/2)])
FinalDf = FinalDf[AllCols]

Этот код не будет самым быстрым, но он должен делать то, что вам нужно.

iloc не устарел — посмотрите документацию, что изменилось.

user19077881 01.08.2024 19:53

@user19077881 user19077881 Я процитировал документацию здесь: pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.h‌​tml

Rowan Harley 01.08.2024 22:50

... что подтверждает, что устарела очень специфическая особенность iloc, а не сама функция, и это никак не влияет на ваш код. Это относится к передаче вызываемой функции, которая возвращает кортеж.

user19077881 01.08.2024 23:09

Ах, ок, я неправильно прочитал. Я обновил ответ

Rowan Harley 01.08.2024 23:28

смотри ответ ответ, спасибо

rlep 05.08.2024 17:37

Первая часть работала с небольшими изменениями - использовалось внешнее соединение pd.merge для создания FinalDf, поскольку concat возвращал ошибку по количеству аргументов.

В строке ColNames изменено значение "olNames = [StartColumns[i] if i < 4 else "".join(StartColumns[i]+""+df.iat[32, i]) for i in range(len(StartColumns)) ]", в вашем решении между каждой буквой l_i_k_e_s_o добавлено подчеркивание.

Продолжаю работать над второй частью

Другие вопросы по теме