Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_Pandas_Dataframe - Fatal编程技术网

Python 按自定义方式对数据帧进行排序

Python 按自定义方式对数据帧进行排序,python,pandas,dataframe,Python,Pandas,Dataframe,我已经用自己的方式对DataFrame列进行了很多排序。但不能正确地做到这一点。因此,请参考给定的代码,让我知道执行此任务的附加语法是什么 df = pd.DataFrame({'TC': {0: '1-1.1', 1: '1-1.2', 2: '1-10.1', 3: '1-10.2', 4: '1-2.1', 5: '1-2.1', 6: '1-2.2', 7: '1-20.1', 8: '1-20.2', 9: '1-3.1'}, 'Case': {0: 'A', 1: 'B', 2: '

我已经用自己的方式对DataFrame列进行了很多排序。但不能正确地做到这一点。因此,请参考给定的代码,让我知道执行此任务的附加语法是什么

df = pd.DataFrame({'TC': {0: '1-1.1', 1: '1-1.2', 2: '1-10.1', 3: '1-10.2', 4: '1-2.1', 5: '1-2.1', 6: '1-2.2', 7: '1-20.1', 8: '1-20.2', 9: '1-3.1'}, 'Case': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J'}})
df.sort_values(["TC"], ascending=[True])
print (df)
此代码不提供所需的输出。我需要的数据帧排序如下


您可以提取数字并形成一个
元组,然后对
序列进行排序,并使用其
索引
重新索引原始数据帧

>>> df.reindex(
        df['TC'].str.extractall('(\d+)')
                .unstack().astype(int)
                .agg(tuple, 1).sort_values()
                .index
    )

       TC Case
0   1-1.1    A
1   1-1.2    B
4   1-2.1    E
5   1-2.1    F
6   1-2.2    G
9   1-3.1    J
2  1-10.1    C
3  1-10.2    D
7  1-20.1    H
8  1-20.2    I
您还可以使用
排序\u值
中的
参数:

>>> df.sort_values('TC', 
        key=lambda ser:
           ser.str.extractall('(\d+)')
              .unstack()
              .astype(int).agg(tuple, 1)
    )
如果一个
ID
始终有三个部分,则可以对
非数字
字符使用
expand=True
,而不是
extractall
,因此无需使用
unstack

>>> df.sort_values('TC', 
         key=lambda series:
             series.str.split(r'\D+', expand=True)
                   .astype(int).agg(tuple,1)
    )
时间:

>>> %timeit df.reindex(df['TC'].str.extractall('(\d+)').unstack().astype(int).agg(tuple, 1).sort_values().index)
2.95 ms ± 40.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda ser: ser.str.extractall('(\d+)').unstack().astype(int).agg(tuple, 1))
2.91 ms ± 32.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda series:series.str.split(r'\D+', expand=True).astype(int).agg(tuple,1))
1.6 ms ± 5.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我制作了一个sort()函数来解决您的查询

将熊猫作为pd导入
df=pd.DataFrame({'TC':{0:'1-1.1',1:'1-1.2',2:'1-10.1',3:'1-10.2',4:'1-2.1',5:'1-2.1',6:'1-2.2',7:'1-20.1',9:'1-3.1'},'Case','0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',8:'I',9:'J'})
def分拣(df):
listTC=[]
对于df['TC']中的i:
append(float(i[2:]))
df1=pd.DataFrame(list(zip(listTC,list(df['Case'])),columns=['TC','Case']))
df_f=df1.排序_值(按=['TC'])
listTC_final=[]
对于df_f['TC']中的i:
listTC_final.append('1-'+str(i))
df_Final=pd.DataFrame(list(zip(listTC_Final,list(df_f['Case'])),columns=['TC','Case']))
返回df_最终版本

打印(排序(df))
我会这样做的。我想这会更快

df["range"] = df["TC"].apply(lambda x: [float(y) for y in x.split("-")])
df = df.sort_values(["range"], ascending=True).drop(["range"], axis="columns")
编辑: 既然你问的是范围的格式是1_1_2而不是1-1.2,我会这样做:

df["range"] = df["TC"].apply(lambda x: tuple(x.split("_")))
df["range"] = df["range"].apply(lambda x: [float(x[0]), float("{}.{}".format(x[1], x[2]))])
df = df.sort_values(["range"], ascending=True).drop(["range"], axis="columns")

你说得很简单,如果数据的格式是“1_2_1”而不是“1-2.1”,那么代码应该是什么呢?事实并非如此,不过,我会有一行额外的代码来将列解析为编辑部分中添加的所需格式