defsplit_dataframe_rows(df,column_selectors):# we need to keep track of the ordering of the columnsdef_split_list_to_rows(row,row_accumulator,column_selector):
split_rows ={}
max_split =0for column_selector in column_selectors:
split_row = row[column_selector]
split_rows[column_selector]= split_row
iflen(split_row)> max_split:
max_split =len(split_row)for i inrange(max_split):
new_row = row.to_dict()for column_selector in column_selectors:try:
new_row[column_selector]= split_rows[column_selector].pop(0)except IndexError:
new_row[column_selector]=''
row_accumulator.append(new_row)
new_rows =[]
df.apply(_split_list_to_rows,axis=1,args =(new_rows,column_selectors))
new_df = pd.DataFrame(new_rows, columns=df.columns)return new_df
d =[pd.DataFrame(df[col].tolist()).add_prefix(col)for col in df.columns]
df = pd.concat(d, axis=1)
id0 id1 id2 value0 value1 value2
01010 NaN apple orange None11567 NaN banana orange None2123445.0 apple banana orange
DECLARE @tt TABLE(i INT IDENTITY,x VARCHAR(8000));
INSERT INTO @tt(x)VALUES('-9;-9;-1;-9;-9;-9;-9;-9;-1;-9;-9;-9;-9;-9;-9;-9;-9;-9;-1;-9;-9;-9;-9;-9;-9;-9;-9;-9;-1;-9;-1;-9;-9;-9;-1;-9;-9;-9;-9;-9;-9;-1;-1;-1;-1;-9;-1;-1;-9;-9;-9;-9;-1;-9;-1;-9;-9;-9;-1;-9;-1;-9;-1;-9;-9;-9;-9;-1;-9;-9;-1;-1;-9;-1;-1;0000;FFF8;-9;-9;-9;-1;-9;-1;-9;FFF6;-9;-1;-9;-1;-9;-1;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9;-9');
SELECT
i,
val1=n.v.value('/e[1]','VARCHAR(16)'),
val2=n.v.value('/e[2]','VARCHAR(16)'),
val3=n.v.value('/e[3]','VARCHAR(16)'),--... repeat for val4 .. val114
val115=n.v.value('/e[115]','VARCHAR(16)')
FROM
@tt
CROSS APPLY (
SELECT
CAST('<e>'+REPLACE(x,';','</e><e>')+'</e>' AS XML) AS itm
) AS i
CROSS APPLY i.itm.nodes('/') AS n(v);