Попробуйте это:
df= df['Data'].str.split('_|-',expand=True)[[1,2]]
Выход:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
Чтобы получить отсортированное значение, используйте ниже,
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
asc= df.apply(np.sort,axis=1)
asc=pd.DataFrame(np.sort(df[['T1','T2']],axis=1)) #alternative way
des= asc[asc.columns.values[::-1]]
print des
Выход:
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
Пояснение:
a) после очистки данных отсортируйте кадр данных в порядке возрастания на основе значений строк, используя np.sort,axis=1
b) Чтобы получить нисходящий порядок, измените порядок столбцов.
в) используйте fillna для получения точного результата.
Edit:
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'})
df['n1']=df['T1'].str.extract('(\d+)').astype(float)
df['n2']=df['T2'].str.extract('(\d+)').astype(float)
res=pd.DataFrame()
res['result'] =df.apply(lambda x: [x['T1'],x['T2']] if x['n1']>x['n2'] else [x['T2'],x['T1']],axis=1).fillna('')
res[['T1','T2']]=res['result'].astype(str).str.replace("\[|\]|'",'').str.split(',',expand=True)
Вывод:
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
Для нескольких столбцов см. Пример ниже,
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
df['n1']=df['T1'].str.extract('(\d+)').astype(float)
df['n2']=df['T2'].str.extract('(\d+)').astype(float)
df['n3']=[432,4,15]
res=pd.DataFrame()
res['result'] =df.apply(lambda x: sorted([x['n1'],x['n2'],x['n3']],reverse=True),axis=1)
res[['T1','T2','T3']]=res['result'].astype(str).str.replace("\[|\]|'",'').str.split(',',expand=True)
Введите:
T2 T1 n1 n2 n3
0 17A 1A 1.0 17.0 432
1 5C NaN 5.0 4
2 3A 28A 28.0 3.0 15
Выход:
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0