Разделение столбцов фрейма данных Python Pandas на основе предыдущей уникальной комбинации столбцов

У меня есть фрейм данных, как показано ниже:

TAG TAG_NAME    METRIC    METRIC_NAME CAPTURE_DATE      MB
DB  PRO     SPACE           A       2024-03-01      3
DB  PRO     SPACE       B       2024-03-01      4
DB  PRO     SPACE       C       2024-03-01      5
DB  PRO     SPACE           D       2024-03-01      6
DB  PRO     SPACE       E       2024-03-01      7
DB  PRO     SPACE           A       2024-03-01      8
DB  PRO     SPACE       B       2024-03-01      9   
DB  PRO     SPACE       C       2024-03-01      10
DB  PRO     SPACE           D       2024-03-01      11
DB  PRO     SPACE       E       2024-03-01      12

Я хочу разделить столбец (МБ) на основе уникальной комбинации столбцов (TAG, TAG_NAME, METRICS, CAPTURE_DATE).

И результат должен выглядеть следующим образом:

TAG TAG_NAME    METRIC    METRIC_NAME CAPTURE_DATE      MB_Firt    MB_Second
DB  PRO     SPACE           A       2024-03-01      3       8
DB  PRO     SPACE       B       2024-03-01      4       9
DB  PRO     SPACE       C       2024-03-01      5       10
DB  PRO     SPACE           D       2024-03-01      6       11
DB  PRO     SPACE       E       2024-03-01      7       12

Я новичок в pandas/Python. Ваша помощь будет высоко оценена.

Пробовал с помощью Pivot и Melt, не помогло.

Это опорная точка, см. № 10 в дубликате.

mozway 02.06.2024 11:16
Почему в 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
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понимаю, вы ищете group_by и reset_index. Я не знаю лучшего решения, но, пожалуйста, дайте мне знать, если найдете его.

>>> grouped = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'CAPTURE_DATE','METRIC_NAME'])
>>> updated_df = grouped.apply(lambda gr: (gr.reset_index()['MB'][0], gr.reset_index()['MB'][1]),include_groups=False).reset_index()
>>> updated_df['MB_First'] = updated_df[0].apply(lambda x:x[0])
>>> updated_df['MB_Second'] = updated_df[0].apply(lambda x:x[1])
>>> print(updated_df)
  TAG TAG_NAME METRIC CAPTURE_DATE METRIC_NAME MB_First  MB_Second
0  DB      PRO  SPACE   2024-03-01           A        3          8
1  DB      PRO  SPACE   2024-03-01           B        4          9
2  DB      PRO  SPACE   2024-03-01           C        5         10
3  DB      PRO  SPACE   2024-03-01           D        6         11
4  DB      PRO  SPACE   2024-03-01           E        7         12

Это то, что ты искал?

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

Используйте groupby()

import pandas as pd

# Creating the initial data frame to debug
data = {
    'TAG': ['DB', 'DB', 'DB', 'DB', 'DB', 'DB', 'DB', 'DB', 'DB', 'DB'],
    'TAG_NAME': ['PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO'],
    'METRIC': ['SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE', 'SPACE'],
    'METRIC_NAME': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
    'CAPTURE_DATE': ['2024-03-01'] * 10,
    'MB': [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
}

df = pd.DataFrame(data)

# Group by the columns and aggregate 'MB' values ionto a list in that column
grouped = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'])['MB'].apply(list).reset_index()

# Split 'MB' into the separate columns
grouped[['MB_First', 'MB_Second']] = pd.DataFrame(grouped['MB'].tolist(), index=grouped.index)

# then drop the original 'MB' column
grouped = grouped.drop(columns=['MB'])

Чтобы обойтись без .tolist()

# Assign an index to differentiateoccurrences
df['index'] = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE']).cumcount() + 1

# Then pivot the table
pivot_df = df.pivot(index=['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'], columns='index', values='MB')

#rRename the columns to what you would like
pivot_df.columns = ['MB_First', 'MB_Second']

# Reset index to flatten the DataFrame
pivot_df = pivot_df.reset_index()

Можно ли сделать это без преобразования фреймов данных в списки? Такое ощущение, что мы потеряем всю производительность панд, преобразуя их в списки. Или он одинаково эффективен?

Shraiysh 02.06.2024 11:19

вы не конвертируете фрейм данных в список, а только значения, принадлежащие группе в столбце 'MB'. Но, конечно, это можно сделать, составив списки.

chitown88 02.06.2024 11:23

Понятно, будет создано только два списка элементов, верно? (это не должно быть проблемой)

Shraiysh 02.06.2024 11:27

да - поставь print(grouped) сразу после grouped = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'])['MB'].apply(list).reset_index(), и ты увидишь, как это работает

chitown88 02.06.2024 11:29

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