Вы можете использовать .str.split (';'), чтобы развернуть столбцы. Сложная мысль - иметь дело со столбцами, которые не нужно разбивать. На мой взгляд, проще на самом деле преобразовать их в одну и ту же строку «строка с запятой» других столбцов, а затем просто перебрать все столбцы и развернуть все. Здесь часть кода с сокращенной версией набора данных. Надеюсь, это поможет вам.
import pandas as pd
import numpy as np
df = pd.DataFrame({'User ID':[1,2],'salary':['65000;120000;70000','65000;120000;70000'],'gender':['male;male;female', 'male;male;female']})
print(df)
Out:
User ID salary gender
0 1 65000;120000;70000 male;male;female
1 2 65000;120000;70000 male;male;female
asd
cols_to_split = ['salary', 'gender']
cols_no_split = ['User ID']
expanded_rows = {}
# need the number of splits to fill
n_splits = len(df[cols_to_split[0]].loc[0].split(";"))
# expand elements of columns with single values to fit the same format of the others
for col in cols_no_split:
df[col] = df[col].apply(lambda x: ''.join([str(x)+';' for i in range(n_splits)]))
df[col] = df[col].apply(lambda x: x[:-1])
# iterate through every column to expand them
for col in (cols_no_split + cols_to_split):
expanded_rows[col] = df[col].str.split(';').apply(pd.Series,1).stack().values
df_final = pd.DataFrame(expanded_rows)
print(df_final)
Out:
User ID salary gender
0 1 65000 male
1 1 120000 male
2 1 70000 female
3 2 65000 male
4 2 120000 male
5 2 70000 female