Skip to main content
 首页 » 编程设计

python之拆分和排序数据框中的值

2025年05月04日11飞鱼

例如,我有一个原始数据数据框:

      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