Структура данных Python: преобразование столбцов в строки - PullRequest
3 голосов
/ 10 мая 2019

У меня есть следующий фрейм данных

d = {'Movie' : ['The Shawshank Redemption', 'The Godfather'],
        'FirstName1': ['Tim', 'Marlon'],
        'FirstName2': ['Morgan', 'Al'],
        'LastName1': ['Robbins', 'Brando'],
        'LastName2': ['Freeman', 'Pacino'],
        'ID1': ['TM', 'MB'],
        'ID2': ['MF', 'AP']
        }
df = pd.DataFrame(d)
df

enter image description here

Я бы хотел перестроить его в 4-х колоночный фрейм данных путем преобразования Firstname1, LastName1, FirstName2, LastName2, ID1, ID2 в 3 строки столбца как FirstName, LastName, ID, затем столбец movie повторяется следующим образом.enter image description here

В sql мы делаем это следующим образом

select Movie as Movie, FirstName1 as FirstName, LastName1 as LastName, ID1 as ID from table
union
select Movie as Movie, FirstName2 as FirstName, LastName2 as LastName, ID2 as ID from table

Можем ли мы достичь этого с помощью панд?

Ответы [ 4 ]

3 голосов
/ 10 мая 2019

Если возможное число в именах столбцов больше похоже на 9, используйте Series.str.extract для получения целых чисел со значениями до MultiIndex для столбцов, поэтому возможно DataFrame.stack:

df = df.set_index('Movie')
df1 = df.columns.to_series().str.extract('([a-zA-Z]+)(\d+)')
df.columns = pd.MultiIndex.from_arrays([df1[0], df1[1].astype(int)])

df = df.rename_axis((None, None), axis=1).stack().reset_index(level=1, drop=True).reset_index()
print (df)
                      Movie FirstName  ID LastName
0  The Shawshank Redemption       Tim  TM  Robbins
1  The Shawshank Redemption    Morgan  MF  Freeman
2             The Godfather    Marlon  MB   Brando
3             The Godfather        Al  AP   Pacino

Если не использовать индексацию для получения последних значений имен столбцов со всеми предыдущими и передачи в MultiIndex.from_arrays:

df = df.set_index('Movie')
df.columns = pd.MultiIndex.from_arrays([df.columns.str[:-1], df.columns.str[-1].astype(int)])
df = df.stack().reset_index(level=1, drop=True).reset_index()
print (df)
                      Movie FirstName  ID LastName
0  The Shawshank Redemption       Tim  TM  Robbins
1  The Shawshank Redemption    Morgan  MF  Freeman
2             The Godfather    Marlon  MB   Brando
3             The Godfather        Al  AP   Pacino
2 голосов
/ 10 мая 2019
df = df.set_index('Movie')
df.columns = pd.MultiIndex.from_tuples([(col[:-1], col[-1:]) for col in df.columns])

df.stack()

#                           FirstName  ID LastName
#Movie                                            
#The Shawshank Redemption 1       Tim  TM  Robbins
#                         2    Morgan  MF  Freeman
#The Godfather            1    Marlon  MB   Brando
#                         2        Al  AP   Pacino

Используйте силу MultiIndex! С from_tuples вы создаете DataFrame, который имеет один столбец для FirstNames, разделенный на FirstName1 и FirstName2 (см. Ниже) и аналогичный для ID и LastName. С stack вы конвертируете его в строки для каждого. Прежде чем сделать это, сделайте Movie Индекс, чтобы исключить его из того, что вы делаете. Вы можете использовать reset_index(), чтобы восстановить все как столбцы, но я не уверен, что вы этого хотите.


До stack:

#                         FirstName         LastName           ID    
#                                 1       2        1        2   1   2
#Movie                                                               
#The Shawshank Redemption       Tim  Morgan  Robbins  Freeman  TM  MF
#The Godfather               Marlon      Al   Brando   Pacino  MB  AP
0 голосов
/ 10 мая 2019

Попробуйте ниже:

d1 = df.filter(regex="1$|Movie").rename(columns=lambda x: x[:-1])
d2 = df.filter(regex="2$|Movie").rename(columns=lambda x: x[:-1])
pd.concat([d1, d2]).rename({'Movi':'Movie'})
0 голосов
/ 10 мая 2019

Я думаю, что простой способ сделать это - использовать функцию копирования из Pandas.Вы можете скопировать столбцы «Фильм», «Имя», «Фамилия», «ИД» в новую таблицу.Затем удалите ненужные столбцы в первом столбце.Вы также можете создать новую таблицу для другого.

new = d['Movie', 'FirstName', 'LastName', 'ID].copy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...