특정 열의 값에 따라 Pandas 데이터 파일의 문자열을 정렬하려면 어떻게해야합니까? [복제]
Dec 02 2020
내 Python 프로그램은 pandas 형식의 데이터 파일을 생성합니다.
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1
... ... ... ... ... ...
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
숫자에 따라 두 번째 (소스) 열을 기준으로 문자열을 정렬해야하므로 정렬 후 줄의 올바른 순서는 cne_1, cne_2, cne_3, cne_4 등이어야합니다.
df_sorted = df.sort_values('Source', ascending=True)
그러나 그것은 줄의 순서에 어떤 변화도 일으키지 않았습니다.
답변
5 jezrael Dec 02 2020 at 19:10
마지막 판다 버전의 경우 값 key
을 분할 _
하고 값을 정수로 변환 하는 매개 변수 를 사용할 수 있습니다 .
df_sorted = df.sort_values('Source', key=lambda x: x.str.split('_').str[1].astype(int))
또는 정렬 된 값의 위치를 가져 와서 다음으로 Series.argsort전달할 수 있습니다 DataFrame.iloc.
df_sorted = df.iloc[df['Source'].str.split('_').str[1].astype(int).argsort()]
print (df_sorted)
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1
3 Vishnudev Dec 02 2020 at 19:10
열에서 정수 값을 가져온 다음이를 사용하여 정렬합니다.
df['sortIndex'] = df.Source.str.replace('cne_', '', regex=False).astype(int)
df_sorted = df.sort_values('sortIndex', ascending=True)
2 BillHuang Dec 02 2020 at 19:10
숫자를 추출하고 int로 변환하고 그에 따라 정렬하십시오. ( .sort_values(0)
이름이 지정되지 않은 열은 0
자동으로 이름이 지정되기 때문에 )
df_sorted = df.loc[df["Source"].str.extract(r"_(\d+)").astype(int).sort_values(0).index]
결과
print(df_sorted)
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1