【问题标题】:column with two types有两种类型的列
【发布时间】:2020-12-09 16:57:38
【问题描述】:

我有一个包含一列的数据框,col1

#ds
col1
1001
  27
1004
0000

ds.dtpyes
col1  object

但是,在本专栏中,python 将 1001, 27, 1004 识别为 float,将 0000 识别为 str

我想像这样对列进行子串化:

#ds
col1   col_new
1001        10
  27        00
1004        10
0000        00
  10        00

但我得到了NaN:

ds['col_new'] = ds['col1'].str[:2]

#ds
col1   col_new
1001       NaN
  27       NaN
1004       NaN
0000        00

有什么帮助吗?谢谢!

更新
我编辑了示例以使其更清晰。
对于只有两位数的,我需要在他们前面填写'00'。
例如,“27”为“0027”。

回答

ds['col1'].astype(int).astype(str).str.zfill(4).str[:2]

【问题讨论】:

  • 如果1001和1004是float的,为什么要变成10?
  • 前导零对整数无效,仅供参考
  • df['col1'].astype(str).str[:2].str.zfill(2)
  • @Chris 您的解决方案很棒。但我编辑了问题以使其更清楚

标签: python pandas data-manipulation


【解决方案1】:

虽然在处理字符串时使用 [:2] 保留每行的前 2 个字符是正确的,但正如您之前提到的,因为前 3 个值被视为 float,那么您需要事先转换完整行到字符串.astype(str)。此外,如果您的值少于 4 个字符,我们可以使用 pad 在提取前 2 个字符之前实际用 0 填充左侧。

因此,我会做以下事情:

df['col1'].astype(str).str.pad(width=4,side='left',fillchar='0').str[:2]

哪些输出:

0    10
1    00
2    10
3    00

完全可重现的例子:

import pandas as pd
df = pd.DataFrame({'col1':[1001,27,1004,'0000']})
df['col1'].astype(str).str.pad(width=4,side='left',fillchar='0').str[:2]

【讨论】:

  • 我编辑了问题以使其更清晰。 27 应该被认为是 0027 所以它应该是 00 in col_new
  • 感谢您的评论,请尝试此答案。
  • 没有得到27的正确结果...我仍然得到27而不是00
  • 我得到 00... 请复制并粘贴代码
  • 我想通了:ds['col1'].astype(int).astype(str).str.zfill(4).str[:2]
【解决方案2】:

使用astype 方法将列中的所有值转换为字符串。然后,当您调用 .str[:2] 时,它们都应该按预期进行。

ds['col_new'] = ds['col1'].astype(str).str[:2]

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多