pandas: 数据框操作后将列转换为整数
我正在使用 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
这个数据有三列,分别是 CUSNO
、S2
和 NAME
,顺序是这样的。
我写了一个脚本来加载这些数据,然后检查第一列,确保它在结果的 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 columns、Change column type in pandas 和 Python - pandas column type casting with "astype" is not working 的解决方案。
也许我在这里漏掉了什么?我是不是需要把新的 DataFrame 复制到一个新变量里?
3 个回答
代码
如果你想要一个可以包含NaN(缺失值)的整数类型,可以使用以下代码:
cl['CUSNO'] = pd.to_numeric(cl['CUSNO'], errors='coerce').astype('Int64')
cl = cl.dropna()
astype('Int64')
可以让整数类型支持NaN。
当你使用 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
我觉得这很简单(在去掉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