如何使用str + number对数据帧进行排序

时间:2017-12-07 02:48:53

标签: python sorting

我现在有了一个数据框,并尝试按照#39;否。'排序。 dataframe就像:

         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

我试过了:

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)

它的工作但是:

         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

我不知道如何对此数据帧进行排序,因为此排序键是str + number。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

按字母顺序将其排序为字符串 您将要重命名 NODE1 - > NODE01 NODE2 - > NODE02 ... NODE9 - > NODE09 NODE10 - >节点10

因为NODE1 NODE12 NODE13 NODE1123123 NODE2 NODE3按字母顺序排序。

答案 2 :(得分:0)

当您按字符串排序时,它将按字母顺序排序(即9之前的10)。

我建议你创建一个引用列,删除“Node”,转换为整数,相应地排序并删除引用列。

e.g。

#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])

希望这有效!

仅供参考詹姆斯的回答更为简洁,使用它。