【问题标题】:Having trouble sorting the Cabin values of the Titanic Dataset properly无法正确排序泰坦尼克号数据集的客舱值
【发布时间】:2017-03-08 01:37:57
【问题描述】:

所以我有一系列 Cabin 值;左侧是索引,右侧列保存 Cabin 值。使用 sort_values 方法后,我只能对值进行部分排序。

x =  Cabin_Fare=Cabin_Fare.sort_values(['Cabin' ]) 

210      A31
186      A32
446      A34
1185     A34
1266     A34
807      A36
97       A 
24       A6 
175      A7 
1058     B10
738     B101
816     B102
1107     B11
330      B18
524      B18
171      B19
691      B20
660      D48
682      D49
626      D50
22       D56
783      D6 
276      D7 
628      D9 
430      E10
718      E101
304      E101
124      E101
461      E12
752      E121
1234     NaN
1252     NaN
1257     NaN
73       NaN
121      NaN

我遇到的问题是尽管能够对舱室字母进行排序,但我无法按舱室字母上的数字进行排序。 所以我想要的输出是

97       A 
24       A6 
175      A7 
210      A31
186      A32
446      A34
1185     A34
1266     A34
807      A36
1058     B10
1107     B11
330      B18
524      B18
171      B19
691      B20
738     B101
816     B102
........

1234     NaN
1252     NaN
1257     NaN
73       NaN
121      NaN

我并不特别关注 NaN 值,但我希望在系列结束时使用它们。如有必要,单独的 Cabin 值(例如单独的“A”)可以添加一个“0”,但我希望没有附加数字的字母排在列表的第一位。

我得到了一些想法,但事实证明这个代码(如下)与字母顺序混淆。我想保留字母顺序。

 x.reindex(x[x.notnull()].str[1:].replace('', 0).astype(int).sort_values().index)

谢谢。

【问题讨论】:

标签: sorting pandas


【解决方案1】:
# setup regex for str.extract
# ?P<letter> tells pandas to make that a column with name 'letter'
regex = '(?P<letter>\D+)(?P<digit>\d*)'
# easy access to column names I'm making in extract step
cols = ['letter', 'digit']

# run extract.  will pull out letter and digit
split_df = df.Cabin.str.extract(regex, expand=True)
# make sure digit column is numeric and fill with 0
split_df['digit'] = pd.to_numeric(split_df['digit'], 'coerce').fillna(0)
# sort by cols gets us the right sort
split_df.sort_values(cols, inplace=True)
# use sorted split_df.index for a slice
df = df.ix[split_df.index]
df.head(20)

【讨论】:

  • 哇,这太聪明了。只是关于这行代码的一个问题:df = df.ix[split_df.index] 这是一种基于已排序 split_df 的索引对原始 df 进行排序的隐式方式吗?这很聪明。我假设您将以某种方式连接 split_df 的两列的值,然后用连接的列替换原始的“Cabin”列。谢谢。
  • @moondra 是的!这是一种排序方式。
  • 它似乎运行良好。我彻底检查了数据框是否存在可能的排序错误,但我没有看到任何错误。谢谢。
【解决方案2】:

您可以轻松地将其拆分为字母和数字:

letter, numbers = cabin[0], cabin[1:]

【讨论】:

  • 在 OP 的问题中可能不是这种情况,但这仅限于字母组件是一个字符。但加一,因为它肯定会更快。您应该展示整个答案,而不仅仅是某个部分的巧妙解决方案。
猜你喜欢
  • 2019-03-01
  • 1970-01-01
  • 2022-07-25
  • 2021-07-29
  • 2017-06-27
  • 2016-06-19
  • 2022-01-03
  • 2020-10-25
  • 2021-11-10
相关资源
最近更新 更多