У меня есть фрейм данных, как показано ниже:
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, не помогло.






Если я правильно понимаю, вы ищете 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()
Можно ли сделать это без преобразования фреймов данных в списки? Такое ощущение, что мы потеряем всю производительность панд, преобразуя их в списки. Или он одинаково эффективен?
вы не конвертируете фрейм данных в список, а только значения, принадлежащие группе в столбце 'MB'. Но, конечно, это можно сделать, составив списки.
Понятно, будет создано только два списка элементов, верно? (это не должно быть проблемой)
да - поставь print(grouped) сразу после grouped = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'])['MB'].apply(list).reset_index(), и ты увидишь, как это работает
Это опорная точка, см. № 10 в дубликате.