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

Posted

技术标签:

【中文标题】str.ljust() 不会对 pandas 列(系列)产生更改(用于对值进行排序)【英文标题】:str.ljust() not producing changes to pandas column(series) (using to sort values) 【发布时间】:2017-03-06 22:17:27 【问题描述】:

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'

但是,这些更改并没有停留在循环之外,而是停留在循环内部。

【问题讨论】:

df.Cabin.str.ljust(3) 做你想做的一切。如果您遇到排序问题,请提出该问题。 哇,你说得对。我不明白为什么我的循环不起作用。当我运行我的循环时,尽管没有错误,但 A5 和 A6 并没有像我运行你的代码时那样被推到左边。 【参考方案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

【讨论】:

由于某种原因,当我在整个系列(不仅仅是示例)上运行上述代码时,我收到了这个错误:ValueError: invalid literal for long() with base 10: '' 你知道问题可能是什么吗?我确实做了一些数据清理,如果插槽中有多个值,我会删除一些值。 这意味着你有条目说只有一个字符,所以第一个和唯一的字符被删除,并且 astype 无法转换它 啊!谢谢。为了解决这个问题,我试图通过迭代将“0”添加到只有一个字符的条目中:for i in x: if len(i)==1: i = i+'0' 但这些更改只发生在 for 循环中;一旦在循环之外,更改就不存在了。我在这里写了代码,但如果它难以辨认,我将更新 OP。非常感谢您的帮助。 在 astype 调用前添加 replace('', 0) 所以我得到的下一个错误是:cannot convert float NaN to integer,我正试图通过这段代码进行协调:x[x.notnull()].reindex( x[x.notnull()].str[1:].replace('', 0).astype(int).sort_values().index) 但现在我得到了这个错误:ValueError: cannot reindex from a duplicate axis 我'我不确定如何解决这个错误。谢谢。

以上是关于str.ljust() 不会对 pandas 列(系列)产生更改(用于对值进行排序)的主要内容,如果未能解决你的问题,请参考以下文章

4-5如何对字符串进行左, 右, 居中对齐

Python:str.ljust()str.rjust()str.center()函数

ljust()方法

Python ljust()方法

python输入输出

Pandas set_index不会删除列