вставка новых столбцов путем разделения каждого столбца и итерации для многих столбцов в фрейме данных python pandas

#python #pandas #iteration

Вопрос:

Здесь у меня есть пример фрейма данных:

 dfx = pd.DataFrame({
        'name': ['alex','bob','jack'],
        'age': ["0,26,4","1,25,4","5,30,2"],
        'job': ["x,abc,0","y,xyz,1","z,pqr,2"],
        'gender': ["0,1","0,1","0,1"]            
    })
 

Я хочу сначала разделить столбец dfx[‘возраст’] и вставить для него 3 отдельных столбца, по одному для каждой подстроки в значении возраста, назвав их dfx[‘возраст1’],dfx[‘возраст2’],dfx[‘возраст3’] . Для этого я использовал следующий код:

 dfx = dfx.assign(**{'age1':(dfx['age'].str.split(',', expand = True)[0]),
         'age2':(dfx['age'].str.split(',', expand = True)[1]),
         'age3':(dfx['age'].str.split(',', expand = True)[2])})
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job', 'gender']]
dfx   
 

Пока все идет хорошо!

Теперь я хочу повторить те же операции с другими столбцами «Работа» и «пол«.

Желаемый Результат

    name     age age1 age2 age3      job job1 job2 job3 gender gender1 gender2
0  alex  0,26,4    0   26    4  x,abc,0    x  abc    0    0,1       0       1
1   bob  1,25,4    1   25    4  y,xyz,1    y  xyz    1    0,1       0       1
2  jack  5,30,2    5   30    2  z,pqr,2    z  pqr    2    0,1       0       1

   
 

У меня нет проблем с тем, чтобы делать это индивидуально для такого небольшого фрейма данных, как этот. Но в самом файле данных есть много таких столбцов. Мне нужны итерации.

Я столкнулся с трудностями при переборе столбцов и присвоении имен отдельным столбцам.

Я был бы очень рад, если бы у меня было лучшее решение для этого.

Спасибо!

Ответ №1:

Используйте понимание списка для разделения столбцов, определенных в списке для списка кадров данных, добавьте отфильтрованные столбцы и объедините их concat с помощью имен столбцов сортировки, затем добавьте не совпадающие столбцы по DataFrame.join :

 cols = ['age','job','gender']

L = [dfx[x].str.split(',',expand=True).rename(columns=lambda y: f'{x}{y 1}') for x in cols]

df1 = dfx[dfx.columns.difference(cols)]
df = df1.join(pd.concat([dfx[cols]]   L, axis=1).sort_index(axis=1))
print (df)
   name     age age1 age2 age3 gender gender1 gender2      job job1 job2 job3
0  alex  0,26,4    0   26    4    0,1       0       1  x,abc,0    x  abc    0
1   bob  1,25,4    1   25    4    0,1       0       1  y,xyz,1    y  xyz    1
2  jack  5,30,2    5   30    2    0,1       0       1  z,pqr,2    z  pqr    2
 

Ответ №2:

Еще раз спасибо @jezrael за ваш ответ. Вдохновленный использованием «f-строки», я решил проблему с помощью итерации следующим образом:

 for col in dfx.columns[1:]:
for i in range(len(dfx[col][0].split(','))):
    dfx[f'{col}{i 1}'] = (dfx[col].str.split(',', expand = True)[i])
    
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job','job1', 'job2','job3', 'gender' 
, 'gender1', 'gender2']]
    
dfx