У меня есть фреймворк данных:
Пример:
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 я исправил
Также California
/California%
@mozway Ага! я починил это
Синтаксическая ошибка во входных данных. Правильные входные данные, например, могут быть следующими: {"Item": ["California%", "2012%", "2013%", "Arizona", "2012%", "2019%", "January%"], "col1": [0, 20, 50, 40, 0, 10, 11], "col2": [0, 20, 50, 40, 0, 15, 13]}
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
Не просто заканчивается на %, «%» может быть где угодно. Позвольте мне отредактировать вопрос.
@ShruthiRavishankar, тогда используйте str.contains
, смотрите обновление
предоставленный ввод не соответствует текстовому вводу, вы должны уточнить