Как создать подзаголовки в фрейме данных Python?

У меня есть фреймворк данных:

Пример:


import pandas as pd
df = pd.DataFrame({'Item': ['California', '2012%', '2013%','Arizona','2012%','%2019','Janu%ary'], 
                   'col1': [0,50, 50,0,10,11,14],'col2': [0, 50, 40,0,15,13,15]})
Output=
    Item  col1 col2
  1  California  0    0
  2  2012%  50   50
  3  2013%  40   40
  4  Arizona  0   0
  5  2012%.    10. 15
  6. %2019.    11. 13
  7. Janu%ary.  14. 15

Я хочу, чтобы имена столбцов, такие как «Калифорния» и «Аризона» (те, которые не имеют «%» в значениях столбца, рассматривались как заголовки, которые должны быть добавлены к их соответствующим подзаголовкам. Например, возможно, перебрать строки и найдите шаблон, например, без «%» в строке означает, что это заголовок, а «%» означает, что это подзаголовок затем для строк «подзаголовок» добавьте последний найденный «заголовок».

 Expected output=
    Item  col1 col2
  
  1  California 2012%  50   50
  2  California 2013%  40   40
  3  Arizona 2012%.    10. 15
  4  Arizona 2019%.    11. 13
  5 Arizona January%.  14. 15

предоставленный ввод не соответствует текстовому вводу, вы должны уточнить

mozway 16.03.2022 13:38

@mozway я исправил

Shruthi Ravishankar 16.03.2022 13:39

Также California/California%

mozway 16.03.2022 13:39

@mozway Ага! я починил это

Shruthi Ravishankar 16.03.2022 13:41

Синтаксическая ошибка во входных данных. Правильные входные данные, например, могут быть следующими: {"Item": ["California%", "2012%", "2013%", "Arizona", "2012%", "2019%", "January%"], "col1": [0, 20, 50, 40, 0, 10, 11], "col2": [0, 20, 50, 40, 0, 15, 13]}

GreyMurav 16.03.2022 13:58
Почему в 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
5
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

IIUC, вы можете использовать маску и выполнить логическое маскирование/индексирование:

# does the name contains '%' (you could use other conditions)
m = df['Item'].str.contains('%')
# mask and ffill the "header", then concatenate
df['Item'] = df['Item'].mask(m).ffill() + ' ' + df['Item']

# drop the former header rows
df = df.loc[m]

выход:

               Item  col1  col2
1  California 2012%    50    50
2  California 2013%    50    40
4     Arizona 2012%    10    15
5     Arizona 2019%    11    13
6  Arizona January%    14    15
альтернатива иметь реальный индекс:
m = df['Item'].str.contains('%')
df['index'] = df['Item'].mask(m).ffill()

df = df.loc[m].set_index('index')

выход:

                Item  col1  col2
index                           
California     2012%    50    50
California     2013%    50    40
Arizona        2012%    10    15
Arizona        2019%    11    13
Arizona     January%    14    15

Не просто заканчивается на %, «%» может быть где угодно. Позвольте мне отредактировать вопрос.

Shruthi Ravishankar 16.03.2022 13:44

@ShruthiRavishankar, тогда используйте str.contains, смотрите обновление

mozway 16.03.2022 13:45

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