Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中的拆分和排序值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 数据帧中的拆分和排序值

Python 数据帧中的拆分和排序值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个原始数据帧,例如: Data 0 XZ_1A-2A 1 XZ_3C 2 XZ_4B-5A 3 XZ_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_3

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

      Data
0   XZ_1A-2A
1   XZ_3C
2   XZ_4B-5A
3   XZ_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

采取以下步骤:

使用.ixnum获取行num处的值。 使用.Split'-'拆分连字符上的值 添加if语句以检查数组中的元素数,并相应地创建数据帧。
希望这会有所帮助。

采取以下步骤:

使用.ixnum获取行num处的值。 使用.Split'-'拆分连字符上的值 添加if语句以检查数组中的元素数,并相应地创建数据帧。 希望这能有所帮助。

试试这个:

df= df['Data'].str.split('_|-',expand=True)[[1,2]]
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
要获得排序值,请使用以下命令:

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
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
说明:

a清理数据后,使用np.sort,axis=1,根据行值按升序对数据框进行排序

b要获得降序,请反转列顺序

c使用fillna得到准确的结果

编辑:

输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
有关多列,请参见下面的示例

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
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
试试这个:

df= df['Data'].str.split('_|-',expand=True)[[1,2]]
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
要获得排序值,请使用以下命令:

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
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
说明:

a清理数据后,使用np.sort,axis=1,根据行值按升序对数据框进行排序

b要获得降序,请反转列顺序

c使用fillna得到准确的结果

编辑:

输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
有关多列,请参见下面的示例

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
输出:

     1     2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
    T1    T2
0   2A    1A
1   3C     
2   5A    4B
3  20C   18A
       result   T1     T2
0   [17A, 1A]  17A     1A
1  [5C, None]   5C      
2   [28A, 3A]  28A     3A
             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
最简单的方法是:

df1 = data["Data"].str.split("-", n = 1, expand = True)
output:

      0        1
0     XZ_1A    2A
1     XZ_3C    None
2     XZ_4B    5A
3     XZ_18A   20C

df2 = df1[0].str.split("_", n = 1, expand = True) 
output : 

   0    1
0  XZ   1A
1  XZ   3C
2  XZ   4B
3  XZ  18A


data["T1"]= df2[1]
data["T2"]= df1[1]
最后你得到了:

         Data   T1    T2
0    XZ_1A-2A   1A    2A
1       XZ_3C   3C  None
2    XZ_4B-5A   4B    5A
3  XZ_18A-20C  18A   20C
最简单的方法是:

df1 = data["Data"].str.split("-", n = 1, expand = True)
output:

      0        1
0     XZ_1A    2A
1     XZ_3C    None
2     XZ_4B    5A
3     XZ_18A   20C

df2 = df1[0].str.split("_", n = 1, expand = True) 
output : 

   0    1
0  XZ   1A
1  XZ   3C
2  XZ   4B
3  XZ  18A


data["T1"]= df2[1]
data["T2"]= df1[1]
最后你得到了:

         Data   T1    T2
0    XZ_1A-2A   1A    2A
1       XZ_3C   3C  None
2    XZ_4B-5A   4B    5A
3  XZ_18A-20C  18A   20C
试试

使用重命名功能替换列名,如下所示

>>> newdf.rename(columns={1: 'T1', 2: 'T2'}, inplace=True)
>>> newdf
    T1    T2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
但是,如果还希望将None替换为空字符串,则可以如下所示:

>>> newdf['T2'].fillna(value='', inplace=True)
>>> newdf
    T1   T2
0   1A   2A
1   3C
2   4B   5A
3  18A  20C
试试

使用重命名功能替换列名,如下所示

>>> newdf.rename(columns={1: 'T1', 2: 'T2'}, inplace=True)
>>> newdf
    T1    T2
0   1A    2A
1   3C  None
2   4B    5A
3  18A   20C
但是,如果还希望将None替换为空字符串,则可以如下所示:

>>> newdf['T2'].fillna(value='', inplace=True)
>>> newdf
    T1   T2
0   1A   2A
1   3C
2   4B   5A
3  18A  20C

@MohamedThasinah谢谢,这很有效。但我发现还有一个问题:它似乎只对第一个数字排序。例如:当值为3和28时,排序后我将在第一列得到3对不起,还有一个问题:如果一行中有两个以上的项需要排序,那么我如何更改此行res['result']=df.apply…然后您必须按降序对行进行排序,并将值存储在同一列表中。如果我有空的话,我会把它更新到我的解决方案中,再问一个问题。有没有办法让多列排序的输出是数字+字母的格式,就像两列排序的输出一样columns@xiumpt-不,你得不到,你会失去订单的。@MohamedThasinah谢谢,它有效。但我发现还有一个问题:它似乎只对第一个数字排序。例如:当值为3和28时,排序后我将在第一列得到3对不起,还有一个问题:如果一行中有两个以上的项需要排序,那么我如何更改此行res['result']=df.apply…然后您必须按降序对行进行排序,并将值存储在同一列表中。如果我有空的话,我会把它更新到我的解决方案中,再问一个问题。有没有办法让多列排序的输出是数字+字母的格式,就像两列排序的输出一样columns@xiumpt-不,你得不到,你会失去订单的。