pandas: 数据框操作后将列转换为整数

2 投票
3 回答
44 浏览
提问于 2025-04-13 02:42

我正在使用 pandas 1.5.3 版本,也尝试过 pandas 2.2.1。

我正在从一个 CSV 文件中加载数据,数据大致长这样:

888|0|TEST ACCOUNT
888|1|Sample Ship-to
802001|0|COMPANY 1
802001|1|COMPANY 1 INC
802001|2|COMPANY 1 BALL
K802001|3|COMPANY 1

这个数据有三列,分别是 CUSNOS2NAME,顺序是这样的。

我写了一个脚本来加载这些数据,然后检查第一列,确保它在结果的 DataFrame 中是 int64 类型。如果不是,脚本会把这一列转换成数字,并删除那些包含 NaN 的行。

所以,开始的时候是:

     CUSNO  S2            NAME
0      888   0    TEST ACCOUNT
1      888   1  Sample Ship-to
2   802001   0       COMPANY 1
3   802001   1   COMPANY 1 INC
4   802001   2  COMPANY 1 BALL
5  K802001   3       COMPANY 1

然后运行:

cl['CUSNO'] = pd.to_numeric(cl.CUSNO, errors='coerce')
cl = cl.dropna(axis='index', how='any')

处理完之后是:

      CUSNO  S2            NAME
0     888.0   0    TEST ACCOUNT
1     888.0   1  Sample Ship-to
2  802001.0   0       COMPANY 1
3  802001.0   1   COMPANY 1 INC
4  802001.0   2  COMPANY 1 BALL

我想把 CUSNO 这一列变成全是 int64 或类似类型的数据,但当我运行 company_locations['CUSNO'].dtype 时,它总是返回 float64。实际上,我想去掉 CUSNO 每个条目末尾的点和小数部分,觉得转换成 int 或类似的类型会是最好的选择。

我尝试了很多解决办法,比如:

cl['CUSNO'] = pd.to_numeric(cl.CUSNO, errors='coerce').dropna().astype(int) # replacing the earlier line 1 of the script
cl['CUSNO'] = cl.astype({'CUSNO': 'int'})
cl['CUSNO'] = cl['CUSNO'].apply(pd.to_numeric, errors='coerce')

我在上面脚本的第二行尝试了 inplace=True。我还尝试了来自 pandas: to_numeric for multiple columnsChange column type in pandasPython - pandas column type casting with "astype" is not working 的解决方案。

也许我在这里漏掉了什么?我是不是需要把新的 DataFrame 复制到一个新变量里?

3 个回答

1

代码

如果你想要一个可以包含NaN(缺失值)的整数类型,可以使用以下代码:

cl['CUSNO'] = pd.to_numeric(cl['CUSNO'], errors='coerce').astype('Int64')
cl = cl.dropna()

astype('Int64') 可以让整数类型支持NaN。

1

当你使用 pd.to_numeric 这个函数时,如果数据里有 NaN(表示缺失值),那么整行的数据类型就会变成 float(浮点数)。

一旦你把 NaN 去掉,就可以运行下面的代码,它会把数据转换回 int(整数)类型:

cl["CUSNO"] = cl["CUSNO"].astype(int)
    CUSNO  Index     Description
0     888      0    TEST ACCOUNT
1     888      1  Sample Ship-to
2  802001      0       COMPANY 1
3  802001      1   COMPANY 1 INC
4  802001      2  COMPANY 1 BALL
1

我觉得这很简单(在去掉NaNs之后):

df["CUSNO"] = df["CUSNO"].astype(int)
print(df)

输出结果是:

    CUSNO  S2            NAME
0     888   0    TEST ACCOUNT
1     888   1  Sample Ship-to
2  802001   0       COMPANY 1
3  802001   1   COMPANY 1 INC
4  802001   2  COMPANY 1 BALL

撰写回答