Сначала измените шаблон для соответствующих групп на r'([A-Z]{4})(\d{4})(.+)'
и используйте Series.str.extract
для нового помощника DataFrame
- преобразовать второй столбец в целые числа, объединить и назначить обратно.
Затем используйте Series.str.split
для MultiIndex
, измените форму на DataFrame.stack
и очистите данные - DataFrame.rename_axis
, DataFrame.reset_index
и DataFrame.sort_values
:
df = pd.DataFrame({
'MNIF0001:w':[2] * 5,
'MNIF0010:w':[4] * 5,
'MNIF0001:f':[6] * 5,
'MNIF0010:f':[8] * 5,
}, index=['01-Feb-63','01-Mar-63','01-Apr-63','01-May-63','01-Jun-63'])
df.index.name = 'date'
print (df)
MNIF0001:w MNIF0010:w MNIF0001:f MNIF0010:f
date
01-Feb-63 2 4 6 8
01-Mar-63 2 4 6 8
01-Apr-63 2 4 6 8
01-May-63 2 4 6 8
01-Jun-63 2 4 6 8
well_pattern=re.compile(r'([A-Z]{4})(\d{4})(.+)')
df1 = df.columns.to_series().str.extract(well_pattern)
print (df1)
0 1 2
MNIF0001:w MNIF 0001 :w
MNIF0010:w MNIF 0010 :w
MNIF0001:f MNIF 0001 :f
MNIF0010:f MNIF 0010 :f
df.columns = df1[0] + '_' + df1[1].astype(int).astype(str) + '_0' + df1[2]
print (df)
MNIF_1_0:w MNIF_10_0:w MNIF_1_0:f MNIF_10_0:f
date
01-Feb-63 2 4 6 8
01-Mar-63 2 4 6 8
01-Apr-63 2 4 6 8
01-May-63 2 4 6 8
01-Jun-63 2 4 6 8
df.columns = df.columns.str.split(':', expand=True)
df = df.stack(0).rename_axis(('date','ID')).reset_index().sort_values(['ID','date'])
print (df)
date ID f w
4 01-Apr-63 MNIF_10_0 8 4
0 01-Feb-63 MNIF_10_0 8 4
8 01-Jun-63 MNIF_10_0 8 4
2 01-Mar-63 MNIF_10_0 8 4
6 01-May-63 MNIF_10_0 8 4
5 01-Apr-63 MNIF_1_0 6 2
1 01-Feb-63 MNIF_1_0 6 2
9 01-Jun-63 MNIF_1_0 6 2
3 01-Mar-63 MNIF_1_0 6 2
7 01-May-63 MNIF_1_0 6 2
РЕДАКТИРОВАТЬ: Если необходимо работать с ID
только для столбца, перекомпилировать columns
в ID
:
df.columns = df.columns.str.split(':', expand=True)
df = df.stack(0).rename_axis(('date','ID')).reset_index().sort_values(['ID','date'])
well_pattern=re.compile(r'([A-Z]{4})(\d{4})')
df1 = df['ID'].str.extract(well_pattern)
df['ID'] = df1[0] + '_' + df1[1].astype(int).astype(str) + '_0'
print (df)
date ID f w
4 01-Apr-63 MNIF_1_0 6 2
0 01-Feb-63 MNIF_1_0 6 2
8 01-Jun-63 MNIF_1_0 6 2
2 01-Mar-63 MNIF_1_0 6 2
6 01-May-63 MNIF_1_0 6 2
5 01-Apr-63 MNIF_10_0 8 4
1 01-Feb-63 MNIF_10_0 8 4
9 01-Jun-63 MNIF_10_0 8 4
3 01-Mar-63 MNIF_10_0 8 4
7 01-May-63 MNIF_10_0 8 4