С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016

Преобразовать dataframe

25.04.2024, 11:00. Показов 558. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть такой скрипт с исходными данными

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
 
data = [
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic1','value': 'Да'},
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic3', 'value': 'One'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic3','value': 'Second'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic3','value': 'Free'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic3','value': 'One'}
]
 
dataFrame = pd.DataFrame(data, columns =['column1', 'column2', 'column3', 'column4', 'column5', 'characteristic', 'value']) 
dataFrame = dataFrame.fillna('', inplace=False)
 
dataFramePivot = dataFrame.pivot(index=['characteristic'], columns=['column1', 'column2', 'column3', 'column4', 'column5'], values='value')

dataFramePivot возвращает такой результат
column1 text1 text2 text3 text4
column2 txt1 txt2 txt3 txt4
column3 3890.0 4790.0  
column4 3720.0 1520.0
column5 3357.0 1444.0
characteristic     
characteristic1 Да Нет Нет Нет
characteristic2 Нет Нет Нет Нет
characteristic3 One Second Free On

Тут первые 6 строк как заголовок.

А надо так
column1 text1 text2 text3 text4
column2 txt1 txt2 txt3 txt4
column3 3890.0 4790.0  
column4 3720.0 1520.0
column5 3357.0 1444.0
characteristic1 Да Нет Нет Нет
characteristic2 Нет Нет Нет Нет
characteristic3 One Second Free On

Первая строка должна быть как заголовок.

Скажите, как правильно написать код?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.04.2024, 11:00
Ответы с готовыми решениями:

DataFrame
Как работает двоеточие в данном случае? (не то что оно делает, а с точки зрения языка) В офф документации только примеры использования,...

Работа в DataFrame
У меня есть дата-фрейм Надо пройтись по столбцу "Бонус для агента (руб.)" и убрать "руб.", что можно было все...

Работа в DataFrame
У меня есть ДатаФрейм и один из столбов называется "От станции" Он содержит такие значения .......25т ...

15
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
25.04.2024, 13:40
MConst, Так?:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd
 
data = [
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic1','value': 'Да'},
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text1','column2': 'txt1','column3': None,'column4': 3720.0,'column5': 3357.0,'characteristic': 'characteristic3', 'value': 'One'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text2','column2': 'txt2','column3': 3890.0,'column4': None,'column5': None,'characteristic': 'characteristic3','value': 'Second'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text3','column2': 'txt3','column3': 4790.0,'column4': None,'column5': None,'characteristic': 'characteristic3','value': 'Free'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic1','value': 'Нет'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic2','value': 'Нет'},
        {'column1': 'text4','column2': 'txt4','column3': None,'column4': 1520.0,'column5': 1444.0,'characteristic': 'characteristic3','value': 'One'}
]
 
df = pd.DataFrame(data, columns =['column1', 'column2', 'column3', 'column4', 'column5', 'characteristic', 'value'])
df = df.fillna('', inplace=False)
 
df1 = df.iloc[:,:5].groupby('column1').first()
df2 = pd.DataFrame(df.groupby('characteristic')['value'].apply(list).to_dict(), index=df1.index)
 
res = pd.concat([df1.T, df2.T])
res
2
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
25.04.2024, 13:49  [ТС]
Немного похоже на костыльный метод, но похоже по другому не получится. Спасибо.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
25.04.2024, 15:54
Лучше так:
Python
1
dataFramePivot.index.name=None
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
26.04.2024, 07:20  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
Лучше так:
Python
1
dataFramePivot.index.name=None
Строка со значением characteristic исчезла. Но в заголовке также 5 строк.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.04.2024, 08:17
Цитата Сообщение от MConst Посмотреть сообщение
Но в заголовке также 5 строк.
Тоже не проблема.

Python
1
2
3
dataFramePivot.index.name=None #убираем "characteristic"
df=dataFramePivot.T.reset_index().T # убираем мультииндекс со столбцов
df.rename(columns=df.iloc[0]).drop(df.index[0]) # первую строку -> заголовок
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
26.04.2024, 09:18  [ТС]
Получается так
Python
1
2
3
4
5
6
7
8
9
dataFramePivot = dataFrame.pivot(index=['characteristic'], columns=['column1', 'column2', 'column3', 'column4', 'column5'], values='value')
dataFramePivot.index.name = None
dataFramePivot = dataFramePivot.transpose().reset_index().transpose()
dataFramePivot = dataFramePivot.rename(columns=dataFramePivot.iloc[0], inplace = False)
dataFramePivot = dataFramePivot.drop (index=dataFramePivot.index [0], axis= 0, inplace= False)
dataFramePivot['column1'] = dataFramePivot.index
dataFramePivot.insert(0, 'column1', dataFramePivot.pop('column1')) 
dataFramePivot = dataFramePivot.reset_index(drop=True, inplace = False)
dataFramePivot
Работает. Возможно, что-то лишнее есть и можно написать оптимальнее.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.04.2024, 09:34
Если без лишних телодвижений (добавить столбец, индекс, убрать индекс), то так:
Python
1
2
3
4
5
6
7
dataFramePivot = dataFrame.pivot(index=['characteristic'], columns=['column1', 'column2', 'column3', 'column4', 'column5'], values='value')
dataFramePivot = dataFramePivot.transpose().reset_index().transpose()
dataFramePivot = dataFramePivot.rename(columns=dataFramePivot.iloc[0], inplace =False)
dataFramePivot.index.name = dataFramePivot.index[0]
dataFramePivot = dataFramePivot.drop (index=dataFramePivot.index[0], axis=0, inplace=False)
dataFramePivot = dataFramePivot.reset_index(drop=False, inplace=False)
dataFramePivot
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
26.04.2024, 09:42  [ТС]
Спасибо!
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.04.2024, 09:47
Вопрос по стилю, если можно.
Почему предпочитаете

Python
1
dataFrame = dataFrame.функция( ... inplace=False)
а не
Python
1
dataFrame.функция( ... inplace=True)
второй же вариант короче
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
26.04.2024, 14:23  [ТС]
Можно и так. Хотя другой вопрос влияет ли на производительность, если датафреймы большие.

Добавлено через 4 часа 32 минуты
Цитата Сообщение от Gdez Посмотреть сообщение
MConst, Так?:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
data = [
            {'model': 'AAA', 'currentPrice': '7 690₽', 'title': 'Функция 1', 'value': 'Нет'},
            {'model': 'BBB, bbb bb', 'currentPrice': '6 998₽', 'title': 'Функция 1', 'value': 'Да'},
            {'model': 'BBB bbb bb, 100 ab', 'currentPrice': '7 890₽', 'title': 'Функция 1', 'value': 'Нет'}
       ]
 
dataFrame = pd.DataFrame(data, columns =['model', 'currentPrice', 'title', 'value']) 
dataFrame.fillna('', inplace=True)
 
df1 = dataFrame.iloc[:,:4].groupby('model').first()
df2 = pd.DataFrame(dataFrame.groupby('title')['value'].apply(list).to_dict(), index=df1.index)
 
res = pd.concat([df1.T, df2.T])
res = res.transpose()

Результат не корректный получается.
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
26.04.2024, 14:54
MConst,
Python
1
2
3
4
5
6
7
…
df1 = dataFrame.iloc[:,:-2].groupby(dataFrame.columns[0]).first()
df2 = pd.DataFrame(dataFrame.groupby(dataFrame.columns[-2])[dataFrame.columns[-1]].apply(list).to_dict(), index=df1.index)
 
res = pd.concat([df1.T, df2.T])
res = res.transpose()
res
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
26.04.2024, 15:05  [ТС]
Не тот результат.

Python
1
2
3
4
5
6
7
8
data = [
            {'model': 'AAA', 'currentPrice': '7 690₽', 'title': 'Функция 1', 'value': 'Нет'},
            {'model': 'BBB, bbb bb', 'currentPrice': '6 998₽', 'title': 'Функция 1', 'value': 'Да'},
            {'model': 'BBB bbb bb, 100 ab', 'currentPrice': '7 890₽', 'title': 'Функция 1', 'value': 'Нет'}
       ]
 
dataFrame = pd.DataFrame(data, columns =['model', 'currentPrice', 'title', 'value']) 
dataFrame.fillna('', inplace=True)
Исходная таблица
model currentPrice title value
AAA 7 690₽ Функция 1 Нет
BBB, bbb bb 6 998₽ Функция 1 Да
BBB bbb bb, 100 ab 7 890₽ Функция 1 Нет

Python
1
2
3
4
5
df1 = dataFrame.iloc[:,:-2].groupby(dataFrame.columns[0]).first()
df2 = pd.DataFrame(dataFrame.groupby(dataFrame.columns[-2])[dataFrame.columns[-1]].apply(list).to_dict(), index=df1.index)
 
res = pd.concat([df1.T, df2.T])
res = res.transpose()
Отображает так
model currentPrice Функция 1
AAA 7 690₽ Нет
BBB bbb bb, 100 ab 7 890₽ Да
BBB, bbb bb 6 998₽ Нет

А надо так
model currentPrice Функция 1
AAA 7 690₽ Нет
BBB bbb bb, 100 ab 7 890₽ Нет
BBB, bbb bb 6 998₽ Да
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
26.04.2024, 17:31
MConst, Да, проблема с сортировкой при группировке.
Судя по первому примеру, к первым столбцам применили pd.explode
Можно попробовать так:
Python
1
2
3
4
5
6
7
…
df1 = dataFrame.iloc[:,:-2].drop_duplicates()
df2 = pd.DataFrame(dataFrame.groupby(dataFrame.columns[-2])[dataFrame.columns[-1]].apply(list).to_dict(), index=df1.index)
 
res = pd.concat([df1.T, df2.T]).T
res.set_index(res.columns[0], inplace=True) #если есть необходимость в индексах по первому столбцу 
res
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,016
27.04.2024, 10:33  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
MConst, Да, проблема с сортировкой при группировке.
Это баг во фреймворке?
Судя по первому примеру, к первым столбцам применили pd.explode
В примерах выше не использовалось pd.explode. Или это автоматически используется в гурппировке?
Можно попробовать так:
Спасибо, теперь норм!
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
27.04.2024, 16:23
MConst,
Это баг во фреймворке?
Нет. Это особенность pandas - «ломается» последовательность (принудительная сортировка) при группировке.
Можно «исправить это», добавив столбец первоначальных индексов, но это доп затраты…
В примерах выше не использовалось pd.explode. Или это автоматически используется в гурппировке?
Ну, если не Вы сами, то скорее всего так «создавалась» база данных по аналогу pd.ffill()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2024, 16:23
Помогаю со студенческими работами здесь

Работа в DataFrame
Есть колонка с буквами в ДатаФрейме. Надо буквы поменять на слова, пишу такой код, но дает ошибку def dom(arg): result = '' if...

IF для dataframe
Всем привет! Просьба подсказать, как правильно прописать следующую логику. if issuerexp.loc > issuerexp.loc: ...

Pandas dataframe
Доброго дня форумчане. Возник следующий вопрос. Есть у меня таблица, которую необходимо "перевернуть". Так dataframe...

Dataframe pandas
Всем привет! Есть dataframe книги. Автор1 книга 1 Автор 2 книга 2 Автор 1 книга 3 Как можно сформировать xml файл с...

Работа с dataframe
Добрый день! Пытаюсь работать с pandas, возник вопрос: У меня есть два поля: id и info (кортеж) Как я могу сгруппировать по айди ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru