Уровни слияния одной и той же переменной, которые находятся в последовательных столбцах - PullRequest
1 голос
/ 28 мая 2019

У меня есть файл данных csv, который имеет 2 заголовка, что означает один заголовок как вопрос, а второй - как вспомогательный заголовок, который имеет несколько уровней или ответов для основного заголовка.Текущий CSV выглядит как таблица ниже

Header  Which country do you live?        Which country you previously visited? 
Users    Canada  USA   UK  Mexico  Norway India  Singapore  Pakistan 
User 1   Canada                                  Singapore
User 2                 UK                 India              
User 3                     Mexico                           Pakistan
User 4                             Norway India 

Мне нужно преобразовать его в таблицу ниже

Users   Which country do you live?  Which country you previously visited?
User 1  Canada                      Singapore
User 2  UK                          India
User 3  Norway                      Pakistan
User 4  Mexico                      India

Может ли кто-нибудь помочь мне с этим?

Вот как мои данныевыглядит как enter image description here

Мой входной файл выглядит следующим образом enter image description here и вот так мой окончательный вывод выглядит как enter image description here

1 Ответ

2 голосов
/ 28 мая 2019

Сначала заполняем пропущенные значения на bfill, затем выбираем первый столбец и удаляем второй уровень MultiIndex на DataFrame.droplevel:

print (df.columns)
MultiIndex(levels=[['Header', 'Which country do you live?'],
                   ['Canada', 'Mexico', 'UK', 'USA', 'Users']],
           codes=[[0, 1, 1, 1, 1], [4, 0, 3, 2, 1]])

#if first column is not index, create it
#df = df.set_index([df.columns[0]])
#if empty strings repalce them to NaNs
#df = df.replace('', np.nan)

df = df.bfill(axis=1).iloc[:, 0].reset_index().droplevel(level=1, axis=1)
print (df)
   Header Which country do you live?
0  User 1                     Canada
1  User 2                         UK
2  User 3                     Mexico
3  User 4                     Norway

EDIT:

df = df.groupby(level=0, axis=1).apply(lambda x: x.bfill(axis=1).iloc[:, 0])
print (df)
   Header Which country do you live? Which country you previously visited?
0  User 1                     Canada                             Singapore
1  User 2                         UK                                 India
2  User 3                     Mexico                              Pakistan
3  User 4                     Norway                                 India
...