2017-12-07 1 views
0

지금 데이터 프레임이 있고 '아니요'로 정렬하려고합니다. 내가 시도str + number를 사용하여 데이터 프레임을 정렬하는 방법

  No.    value1     value2 
0  NODE11    1654      14 
1  NODE10    1710     817 
2  NODE9    1162      23 
3  NODE8    1883     198 
4 no match    2303      0 
5  NODE1    1098      67 
6  NODE3    1488      78 
7  NODE2    2426      49 
8  NODE5    1974      90 
9  NODE4    1767      11 
10  NODE7    1708      26 
11  NODE6    2418     248 

: 같은 dataframe이다

df.to_csv('count.csv',index = False) 
df = pd.read_csv('count.csv', thousands=',', parse_dates=['No.']) 
df = df.sort_values(by=['No.', 'only can on this node'], ascending=[True, False]) 
df.to_csv('count.csv',index = False) 

그 작업 만 :이 정렬 키가 STR + 숫자이기 때문에이 dataframe를 정렬하는 방법을 잘 모릅니다

  No.    value1     value2 
5  NODE1    1098      67 
1  NODE10    1710     817 -------error 
0  NODE11    1654      14 -------error 
7  NODE2    2426      49 
6  NODE3    1488      78 
9  NODE4    1767      11 
8  NODE5    1974      90 
11  NODE6    2418     248 
10  NODE7    1708      26 
3  NODE8    1883     198 
2  NODE9    1162      23 
4 no match    2303      0 

. 어떤 아이디어? 감사!

답변

0

그것의 순으로 당신은 NODE1 이름을 바꿀 것입니다 문자열처럼 정렬 -> NODE01 NODE2 -> NODE02 ... NODE9 -> NODE09 NODE10 -> NODE10

때문에를 NODE1 NODE12 NODE13 NODE1123123 NODE2 NODE3은 사전 순으로 정렬됩니다.

1

열은 문자열이며 그 순서대로 정렬됩니다.

그러나 No. 열을 문자열 열과 정수 열이있는 새 데이터 프레임으로 구문 분석하고, 해당 데이터 프레임을 정렬하고, 정렬 된 인덱스를 사용하여 원본 데이터 프레임을 다시 배열 할 수 있습니다.

df2 = df['No.'].str.extractall('([A-Za-z ]+)(\d+)?').reset_index(drop=True) 
df2[1] = df2[1].astype(float) 
df.loc[df2.sort_values([0,1]).index] 

# returns: 
     No. value1 value2 
5  NODE1 1098  67 
7  NODE2 2426  49 
6  NODE3 1488  78 
9  NODE4 1767  11 
8  NODE5 1974  90 
11  NODE6 2418  248 
10  NODE7 1708  26 
3  NODE8 1883  198 
2  NODE9 1162  23 
1  NODE10 1710  817 
0  NODE11 1654  14 
4 no match 2303  0 
+0

좋아, 나는 너의 뜻을 알아 냈어. 하지만이 코드는 내 뒤에이 코드를 추가해도 아무런 변화가 없습니다. 하지만 어쨌든 고맙겠습니다. –

0

문자열로 정렬하면 알파벳순으로 정렬됩니다 (예 : 10에서 9 사이).

참조 열을 만들고 "노드"를 제거하고 정수로 변환하고 그에 따라 정렬하고 참조 열을 제거하는 것이 좋습니다.

#split into sortable and not 
df_to_sort = df.ix[df['No.'] != "no match",:] 
df_to_not_sort = df.ix[df['No.'] == "no match",:] 

#create a reference column 
df_to_sort.ix[:,'reference'] = df_to_sort['No.'].str.replace("NODE","") 

#convert type to an integer 
df_to_sort.ix[:,'reference'] = df.ix[:,'reference'].astype(int) 

#sort the sortable part 
df_sorted = df_to_sort.sort_values('reference') 

#drop the reference column 
df_sorted = df_sorted.drop(['reference'],axis=1) 

#append the non sorted (i.e. no match) section to the bottom 
df = df_sorted.append([df_to_not_sort]) 

잘하면 작동합니다.

참고 제임스의 대답은 좀 더 간결하고 사용하십시오.

+0

어쨌든 고마워요.하지만 코드'df_sorted = df_sorted.drop [ 'reference'], 축 = 1]에서''axis = 1' –

+0

에 오류가 있습니다. – Will

관련 문제