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

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

25.04.2024, 11:00. Показов 603. Ответов 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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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,032
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,032
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,032
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,032
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,032
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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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,032
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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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,032
27.04.2024, 10:33  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
MConst, Да, проблема с сортировкой при группировке.
Это баг во фреймворке?
Судя по первому примеру, к первым столбцам применили pd.explode
В примерах выше не использовалось pd.explode. Или это автоматически используется в гурппировке?
Можно попробовать так:
Спасибо, теперь норм!
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru