Regex на pandas dataframe для изменения имен столбцов, а затем переформатировать формат dataframe - PullRequest
1 голос
/ 06 апреля 2019

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

enter image description here

Хотел бы изменить имена столбцов и переставить фрейм данных в следующий формат: -

enter image description here

Я попробовал приведенный ниже код, чтобы преобразовать имена столбцов из объекта в список, а затем вырезать и разделить строку.Но все же есть пробелы после этого.Не знаю, почему.

df_col_list=df.columns.tolist()
list =[]
for elem in df_col_list:
    list.extend(elem.strip().split(':'))
list

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

well_pattern=re.compile(r'[A-Z]{4}\d{4}')
for item_list in list:
    wellname=re.findall(well_pattern,item_list)
    for n in wellname:
        fld, well_no= n[:4], int(n[4:8])
        item_list = item_list.replace(n, '%s_%d_0' % (fld, well_no))
    print(item_list)

Сработало, чтобы изменить 'MNIF0001'до' MNIF_1_0 '.Но как мне затем использовать этот вывод, чтобы заполнить новые столбцы в окончательном формате фрейма данных?

Я застрял и не уверен, что делать дальше.Пожалуйста, помогите

Заранее спасибо

1 Ответ

3 голосов
/ 06 апреля 2019

Сначала измените шаблон для соответствующих групп на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...