str.ljust()不对pandas列(系列)进行更改(用于排序值)

时间:2016-10-25 02:03:30

标签: string sorting pandas

Cabin_Fare.Cabin.head(20)(产生这些结果)

583    A10
208    A11
475    A14
556    A16
331    A18
284    A19
599    A20
28     A21
630    A23
867    A24
647    A26
112    A29
209    A31
185    A32
445    A34
293    A34
374    A34
806    A36
96      A5
23      A6

我将它分配给x并将对象类型转换为字符串类型。

x = Cabin_Fare.Cabin.astype('string')

我正在尝试将A5 / A6(最后两个值)之类的值推到左侧一个空格,因为在对列进行排序时,任何只有len为2的值都没有正确排序。我假设是因为它们与那些len为3的值不一致。

所以我尝试运行此代码,但我没有看到任何更改(A5 / A6没有向左推一个空格)

for i in x[x.notnull()]:
    if len(i) == 2:
        i= i.ljust(3,)

编辑:我正在尝试使用Boud的解决方案而且我遇到了一个问题,因为有值/实例只存在字母(没有数字)。 错误显示为:

ValueError: invalid literal for long() with base 10: ''

为了避免这种情况,我试图在只有字母的值中添加“0”。

for i in x:
    if len(i)==1:
        i = i+'0'

然而,这些变化并没有停留在循环之外,只是在内部。

1 个答案:

答案 0 :(得分:1)

实际上,你的价值观并没有领先的空间。对字符串排序将应用按字母顺序排列的字母顺序。所有字符串都以A开头,然后第二个字符是数字,5和6是在您的示例中大于0,1,2和3的数字。因此,数字被认为是数字,但是作为单个数字的序列。

如果您希望按A之后的数字进行排序,请删除第一个字符,转换为int,对该系列的int进行排序,然后基于x重新引用x.reindex(x.str[1:].astype(int).sort_values().index) Out[57]: 18 A5 19 A6 0 A10 1 A11 2 A14 3 A16 4 A18 5 A19 6 A20 7 A21 8 A23 9 A24 10 A26 11 A29 12 A31 13 A32 14 A34 15 A34 16 A34 17 A36 Name: Cabin, dtype: object 来提取数字在正确排序的结果索引上:

dynamic