Перераспределение таблицы фреймов данных Pandas Python - PullRequest
0 голосов
/ 26 марта 2020

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

Id   Name    Exam    Result     Exam        Result
1     Bob    Maths     10      Physics       9
2     Mar    ML        8       Chemistry     10       

Я хотел бы удалить дублирующиеся столбцы и добавить их значение в соответствующие строки. Что-то ниже

Id   Name   Exam     Result
1    Bob    Maths      10
1    Bob    Physics    9
2    Mar     ML        8
2    Mar   Chemistry   10

Есть ли способ сделать это в Python?

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Сначала создайте MultiIndex по первым столбцам, которые не дублируются на DataFrame.set_index, затем создайте MultiIndex in columns по счетчику дубликатов имен с GroupBy.cumcount wotking с Series, поэтому Index.to_series и последнее изменение на DataFrame.stack с DataFrame.reset_index для удаления уровня помощника и затем для MultiIndex в столбцы:

df = df.set_index(['Id','Name'])
s = df.columns.to_series()
df.columns = [s, s.groupby(s).cumcount()]
df = df.stack().reset_index(level=2, drop=True).reset_index()
print (df)
   Id Name       Exam  Result
0   1  Bob      Maths      10
1   1  Bob    Physics       9
2   2  Mar         ML       8
3   2  Mar  Chemistry      10
1 голос
/ 26 марта 2020

Это альтернативный вариант использования pandas melt :

#flip table into long format    
(df.melt(['Id','Name'])
 #sort by Id so that result follows immediately after Exam
 .sort_values('Id')
 #create new column on rows that have result in the variable column
 .assign(Result=lambda x: x.loc[x['variable']=="Result",'value'])
 .bfill()
 #get rid of rows that contain 'result' in variable column
 .query('variable != "Result"')
 .drop(['variable'],axis=1)
 .rename(columns={'value':'Exam'})
 )

    Id  Name    Exam       Result
0   1   Bob     Maths       10
4   1   Bob     Physics      9
1   2   Mar     ML           8
5   2   Mar    Chemistry    10

В качестве альтернативы, просто для удовольствия:

df = df.set_index(['Id','Name'])

#get boolean of duplicated columns
dupes = df.columns.duplicated()

#concatenate first columns and their duplicates
pd.concat([df.loc[:,~dupes],
           df.loc[:,dupes]
          ]).sort_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...