Создать новый столбец на основе предыдущего значения строки и удалить текущую строку - PullRequest
5 голосов
/ 29 июня 2019

У меня есть входной фрейм данных, который можно сгенерировать из приведенного ниже кода

  df = pd.DataFrame({'subjectID' :[1,1,2,2],'keys': 
  ['H1Date','H1','H2Date','H2'],'Values': 
  ['10/30/2006',4,'8/21/2006',6.4]})

Входной фрейм данных выглядит так, как показано ниже

enter image description here

Это то, что я сделал

s1 = df.set_index('subjectID').stack().reset_index()

s1.rename(columns={0:'values'}, 
             inplace=True)
d1 = s1[s1['level_1'].str.contains('Date')]
d2 = s1[~s1['level_1'].str.contains('Date')]

d1['g'] = d1.groupby('subjectID').cumcount()
d2['g'] = d2.groupby('subjectID').cumcount()

d3 = pd.merge(d1,d2,on=["subjectID", 'g'],how='left').drop(['g','level_1_x','level_1_y'], axis=1)

Хотя это работает, я боюсь, что это не лучший подход.Поскольку у нас может быть более 200 столбцов и 50 тыс. Записей.Любая помощь по дальнейшему улучшению моего кода очень полезна.

Я ожидаю, что мой выходной кадр данных будет выглядеть так, как показано ниже

enter image description here

1 Ответ

1 голос
/ 29 июня 2019

может быть что-то вроде:

s=df.groupby(df['keys'].str.contains('Date').cumsum()).cumcount()+1

final=(df.assign(s=s.astype(str)).set_index(['subjectID','s']).
       unstack().sort_values(by='s',axis=1))
final.columns=final.columns.map(''.join)
print(final)

           keys1     Values1 keys2 Values2
subjectID                                  
1          H1Date  10/30/2006    H1       4
2          H2Date   8/21/2006    H2     6.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...