>source

이와 비슷한 데이터가 있습니다.

data = [
dict(name = 'test1', index = '1' , status='fail'),
dict(name = 'test3', index = '3', status='pass'),
dict(name = 'test1', index = '11', status='pass'),
dict(name = 'test1', index = '1 2 14 56', status='fail'),
dict(name = 'test3', index = '20', status='fail'),
dict(name = 'test1', index = '2' , status='fail'),
dict(name = 'test3', index = '5:1:50', status='pass'),]

'index'열의 유형은 str입니다. 불규칙한 항목이 있기 때문에 쉽게 숫자 유형으로 변환 할 수 없습니다. (이게 가능하다면이 질문이 없을 것입니다.)

먼저 DataFrame으로 변환합니다.

df = pd.DataFrame(data)

이것은 나에게 준다

   name    index     status
0   test1   1         fail
1   test3   3         pass
2   test1   11        pass
3   test1   1 2 14 56 fail
4   test3   20        fail
5   test1   2         fail
6   test3   5:1:50    pass

다음으로 정렬합니다.

df1 = df.sort_values(by=['name','index'])

'index'열은 'str'이므로 어휘 순으로 정렬됩니다.

   name    index     status
0   test1   1         fail
3   test1   1 2 14 56 fail
2   test1   11        pass
5   test1   2         fail
4   test3   20        fail
1   test3   3         pass
6   test3   5:1:50    pass

내가 실제로 원하는 것은 다음과 같습니다.

   name    index     status
0   test1   1         fail
5   test1   2         fail
2   test1   11        pass
3   test1   1 2 14 56 fail
1   test3   3         pass
4   test3   20        fail
6   test3   5:1:50    pass

행 번호 4 및 7 (DF 인덱스 3 및 6)의 불규칙한 값도 각 테스트 그룹의 시작 부분으로 이동할 수 있습니다. 요점은 숫자 표현으로 변환 할 수있는 '인덱스'열의 값을 숫자로 정렬해야한다는 것입니다. 그리고 바람직하게는 제자리에. 어떻게?

  • 답변 # 1

    이름과 임시 열 ( __ix ) 각각에서 발견 된 첫 번째 정수 (연속 자릿수)입니다. 'index' 끈:

    df = (
        df
        .assign(
            __ix=df['index']
            .apply(lambda s: int(re.match(r'\D*(\d+)', s).group(0)))
        )
        .sort_values(['name', '__ix'])
        .drop('__ix', axis=1)
        .reset_index(drop=True)
    )
    
    

    데이터에서 (쉽게 재현 가능한 예를 제공 해주셔서 감사합니다) 먼저 어떤 것이 __ix 열은 다음과 같습니다.

    df['index'].apply(lambda s: int(re.match(r'\D*(\d+)', s).group(0)))
    # out:
    0     1
    1     3
    2    11
    3     1
    4    20
    5     2
    6     5
    
    

    정렬 후 df는 다음과 같습니다.

       name      index status
    0  test1          1   fail
    1  test1  1 2 14 56   fail
    2  test1          2   fail
    3  test1         11   pass
    4  test3          3   pass
    5  test3     5:1:50   pass
    6  test3         20   fail
    
    

  • 답변 # 2

    한 가지 가능성은 인덱스의 길이를 제공하는 열을 만드는 것입니다.

    df['sort'] = df['index'].str.len()
    df1 = df.sort_values(by=['name','sort'])
    
    

관련 자료

  • 이전 c++ - 임시에 대한 참조 반환
  • 다음 python - 사전에서 단어 검색 기능