Панды вставляют новый столбец на основе значения заголовка двух столбцов

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

import pandas as pd

exam_1 = {
  'Name': ['Jonn', 'Tomas', 'Fran', 'Olga', 'Veronika', 'Stephan'],
  'Mat': [85, 75, 50, 93, 88, 90],
  'Science': [96, 97, 99, 87, 90, 88],
  'Reading': [80, 60, 72, 86, 84, 77],
  'Wiritng': [78, 82, 88, 78, 86, 82],
  'Lang': [77, 79, 77, 72, 90, 92],
}

exam_2 = {
  'Name': ['Jonn', 'Tomas', 'Fran', 'Olga', 'Veronika', 'Stephan'],
  'Mat': [80, 80, 90, 90, 85, 80],
  'Science': [50, 60, 85, 90, 66, 82],
  'Reading': [60, 75, 55, 90, 85, 60],
  'Wiritng': [56, 66, 90, 82, 60, 80],
  'Lang': [80, 78, 76, 90, 77, 66],
}

df_1 = pd.DataFrame(exam_1)
df_2 = pd.DataFrame(exam_2)

#cmp = pd.merge(df_1, df_2, how = "outer", on=["Name"], suffixes=("_1", "_2"))

cmp = pd.merge(
  df_1, df_2, how = "outer", on=["Name"],
  suffixes=("_1", "_2")).set_index("Name").sort_index(axis=1).reset_index()

print(cmp)

Вывод приведенного выше кода аналогичен приведенному ниже;

       Name  Lang_1  Lang_2  Mat_1  Mat_2  Reading_1  Reading_2  Science_1  Science_2  Wiritng_1  Wiritng_2
0      Jonn      77      80     85     80         80         60         96         50         78         56
1     Tomas      79      78     75     80         60         75         97         60         82         66
2      Fran      77      76     50     90         72         55         99         85         88         90
3      Olga      72      90     93     90         86         90         87         90         78         82
4  Veronika      90      77     88     85         84         85         90         66         86         60
5   Stephan      92      66     90     80         77         60         88         82         82         80

Я хочу, чтобы добавить новый столбец после сравниваемого значения, есть ли какая-либо встроенная функция для этого. Поскольку постоянный раздел, такой как имя, может быть изменен, возможно, 3 столбца могут быть постоянными в будущем. Я хочу использовать встроенную функцию для повторного использования.

Я пытаюсь использовать его вручную, но его нельзя использовать повторно.

Что я хочу именно ниже;

       Name  Lang_1  Lang_2  Lang_Res Mat_1  Mat_2  Mat_Res Reading_1  Reading_2  Reading_Res Science_1  Science_2  Science_Res Writing_1  Writing_2  Writing_Res 
0      Jonn      77      80  Lang_data   85     80  Mat_data       80         60  Reading_data       96         50  Science_data       78         56  Writing_data 
1     Tomas      79      78  Lang_data   75     80  Mat_data       60         75  Reading_data       97         60  Science_data       82         66  Writing_data 
2      Fran      77      76  Lang_data   50     90  Mat_data       72         55  Reading_data       99         85  Science_data       88         90  Writing_data 
3      Olga      72      90  Lang_data   93     90  Mat_data       86         90  Reading_data       87         90  Science_data       78         82  Writing_data 
4  Veronika      90      77  Lang_data   88     85  Mat_data       84         85  Reading_data       90         66  Science_data       86         60  Writing_data 
5   Stephan      92      66  Lang_data   90     80  Mat_data       77         60  Reading_data       88         82  Science_data       82         80  Writing_data

Можете ли вы привести пример того, как вы хотите, чтобы ваш вывод выглядел?

imad97 27.11.2022 08:39

отредактировал исходный пост

yss 27.11.2022 10:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понимаю, вы надеетесь вычислить столбец из двух других связанных столбцов.

Я предлагаю вот что.

  1. Сохраняйте префиксы основных столбцов в виде списка.
prefixes = ['Lang', 'Mat', 'Reading', ...]
  1. Используйте эти префиксы для автоматизации поиска и вычисления в каждом столбце. Допустим, мы хотим сохранить среднее значение элементов _1 и _2 для каждого префикса.
for prefix in prefixes:
    column1 = df[f"{prefix}_1"]
    column2 = df[f"{prefix}_2"]
    averaged = (column1 + column2) / 2
    df.loc[:, f"{prefix}_average"] = averaged

Это добавит средний столбец для каждой категории, для которой у вас есть префикс.

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

yss 27.11.2022 09:43

Как бы вы хотели, чтобы он выводил, какие столбцы объединять?

Mike L 27.11.2022 10:01

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

yss 27.11.2022 10:27
Ответ принят как подходящий

Вы можете начать с создания списка, в котором каждый столбец имеет суффикс _2, а затем использовать pandas.DataFrame.insert с pandas.Index.get_loc в понимании списка, чтобы вставить столбцы результатов туда, где они должны.

Попробуй это :

edge_cols= cmp.columns.str.extractall("(\w+_2)")[0].tolist()

[cmp.insert(cmp.columns.get_loc(col)+1, col.split("_")[0]+"_Res", col.split("_")[0]+"_Data") for col in edge_cols]

# Выход :

print(cmp.to_string())

       Name  Lang_1  Lang_2   Lang_Res  Mat_1  Mat_2   Mat_Res  Reading_1  Reading_2   Reading_Res  Science_1  Science_2   Science_Res  Wiritng_1  Wiritng_2   Wiritng_Res
0      Jonn      77      80  Lang_Data     85     80  Mat_Data         80         60  Reading_Data         96         50  Science_Data         78         56  Wiritng_Data
1     Tomas      79      78  Lang_Data     75     80  Mat_Data         60         75  Reading_Data         97         60  Science_Data         82         66  Wiritng_Data
2      Fran      77      76  Lang_Data     50     90  Mat_Data         72         55  Reading_Data         99         85  Science_Data         88         90  Wiritng_Data
3      Olga      72      90  Lang_Data     93     90  Mat_Data         86         90  Reading_Data         87         90  Science_Data         78         82  Wiritng_Data
4  Veronika      90      77  Lang_Data     88     85  Mat_Data         84         85  Reading_Data         90         66  Science_Data         86         60  Wiritng_Data
5   Stephan      92      66  Lang_Data     90     80  Mat_Data         77         60  Reading_Data         88         82  Science_Data         82         80  Wiritng_Data

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