根据列的第一位对数据框进行排序

时间:2018-08-17 12:21:43

标签: python pandas numpy

我有一个这样的数据框:

        Produtos    Estoque total     Valor Total de estoque
0            70        10000                  7180
1            70      2800000               2011550
2            70       125000                 89800
3            71       540000                530980
4            71        89000                 79280
5            84       205000                572770
...         ...           ...                    ...
14988   1003254        46000               1329400
14989   1003273     30570000               5502600
14990   1003274     62000000               3720000
14991   1003275    200000000               3840000
14992   1003276       710000               2108700
14993   1003279      6750000                715330

我正在尝试对“ Produtos”列进行排序,首先考虑第一个数字(如果相等,则考虑第二个,依此类推),例如:

100
1001
1002
10003
10004
100000
200
2001
20002

我发现我应该使用以下命令:

line.sort(key=lambda line: int(line.split()[0]))

但是我很难以正确的方式使用。

2 个答案:

答案 0 :(得分:3)

首先通过indexing by str获取第一个值的值,通过argsort获取排名,最后通过iloc重新排序:

df = df.iloc[df['Produtos'].astype(str).str[0].argsort()]
print (df)
       Produtos  Estoque total  Valor Total de estoque
14988   1003254          46000                 1329400
14989   1003273       30570000                 5502600
14990   1003274       62000000                 3720000
14991   1003275      200000000                 3840000
14992   1003276         710000                 2108700
14993   1003279        6750000                  715330
0            70          10000                    7180
1            70        2800000                 2011550
2            70         125000                   89800
3            71         540000                  530980
4            71          89000                   79280
5            84         205000                  572770

编辑:按首个值和长度排序可能是这个技巧-由助手DataFrame按索引选择len按首个值:

print (df)
          Produtos  Estoque total  Valor Total de estoque
0               70          10000                  7180.0
1               70        2800000               2011550.0
2               71         125000                 89800.0
3              710         540000                530980.0
4             7100          89000                 79280.0
5               84         205000                572770.0
14988  10032546000        1329400                     NaN
14989        10032       30570000               5502600.0
14990         1003       62000000               3720000.0
14991          100      200000000               3840000.0
14992           10         710000               2108700.0
14993      1003279        6750000                715330.0

s = df['Produtos'].astype(str)
i = pd.DataFrame(np.c_[s.str[0].astype(int), s.str.len()]).sort_values([0,1]).index
print (i)
Int64Index([10, 9, 8, 7, 11, 6, 0, 1, 2, 3, 4, 5], dtype='int64')
df = df.iloc[i]
print (df)
          Produtos  Estoque total  Valor Total de estoque
14992           10         710000               2108700.0
14991          100      200000000               3840000.0
14990         1003       62000000               3720000.0
14989        10032       30570000               5502600.0
14993      1003279        6750000                715330.0
14988  10032546000        1329400                     NaN
0               70          10000                  7180.0
1               70        2800000               2011550.0
2               71         125000                 89800.0
3              710         540000                530980.0
4             7100          89000                 79280.0
5               84         205000                572770.0

答案 1 :(得分:0)

像往常一样,@jezrael 的回答详细而精彩。但我发现了另一种选择,我认为值得分享:

对于 Pandas 版本 >= 1.1

我们可以在 sort_values 中使用 key 参数:

df.sort_values(by = ['Estoque'], key = lambda x:x.astype(str).str[0])

(抱歉,我无法将列与 pd.read_clipboard() 对齐)

结果

res