例如,我有一个原始数据数据框:
Data
0 XZ_1A-2A
1 XZ_3C
2 XZ_4B-5A
3 XZ_18A-20C
我想拆分(并删除 XZ_)它成为
Data T1 T2
0 XZ_1A-2A 1A 2A
1 XZ_3C 3C
2 XZ_4B-5A 4B 5A
3 XZ_18A-20C 18A 20C
然后按数字排序
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
感谢您的帮助。
[固定]
更新_1:
输入数据时:
Data
0 XZ_17A-1A
1 XZ_5C
2 XZ_3A-28A
并编译
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
asc=pd.DataFrame(np.sort(df[['T1','T2']],axis=1))
des= asc[asc.columns.values[::-1]]
我得到了输出
1 0
0 1A 17A
1 5C
2 3A 28A
更新_2:
如果单行中有超过 2 个项目(大约 1~5 个),如何排序?
Data
0 XZ_17A-1A
1 XZ_5C
2 XZ_3A-28A
3 XZ_5A-19A-42C
4 XZ_3A-28A-41A-42A
请您参考如下方法:
试试这个:
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) 要获得降序,请反转列顺序。
c) 使用 fillna 得到准确的结果。
编辑:
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
