为什么read_sas会将字符串转换为浮点型?

时间:2019-07-15 08:53:11

标签: python-3.x pandas sas

我正在尝试使用.sas7bdat来读取pandas文件,但由于pandas正在将看起来像数字的字符串值转换为浮点数,所以我遇到了麻烦。

例如,如果我有一个像'348386789'这样的电话号码,并且使用以下代码阅读了该电话号码:

import pandas as pd

df = pd.read_sas('test.sas7bdat', format='sas7bdat', encoding='utf-8')

输出为348386789.0

我可以用诸如df['number'].astype(int).astype(str)之类的东西来转换每一列,但这将非常无效。

read_csv函数中存在相同的问题,但是您可以使用参数dtype来设置所需列的类型(例如dtype={'number': str)})。

是否有更好的方法来读取所需格式的值并在数据框中使用它?

更新

我什至尝试使用sas7bdat.pypyreadstat来获得相同的结果。您可能会说问题出在数据中,但是使用在线tool来读取sas7bdat数据似乎是正确的。

其他两个库的代码:

# pyreadstat module
import pyreadstat
df2, meta = pyreadstat.read_sas7bdat('test.sas7bdat')

# sas7bdat module
from sas7bdat import SAS7BDAT
reader = SAS7BDAT('test.sas7bdat') 
df_sas = reader.to_data_frame()

如果您想尝试(并且拥有SAS许可证),则可以创建一个具有以下内容的.sas7bdat文件:

column_1,column_2,column_3
11,20190129,5434
19,20190228,5236
59,20190328,10448
76,20190129,5434

1 个答案:

答案 0 :(得分:2)

使用sas7bdat.py代替。通常可以更好地保留数据集格式。

如果在SAS数据集中将特定列定义为字符,那么无论内容如何,​​sas7bdat都将其作为字符串读取。举个懒惰的例子,我在SAS中创建了这个数据集:

data test;
  id = '1111111'; val = 1; output;
  id = '2222222'; val = 2; output;
run;

然后在其上运行以下Python代码:

reader = SAS7BDAT('test.sas7bdat')
df = reader.to_data_frame()
print(df)

cols = reader.columns
for col in cols:
    print(str(col.name) + " " + str(col.type))

这是我看到的:

        id  val
0  1111111  1.0
1  2222222  2.0

b'id' string
b'val' number

如果要根据上下文将数字“智能地”转换为字符串,则可能需要查找其他地方。任何SAS数据集读取器都只会根据数据集中指定的格式进行读取。

相关问题