我正在尝试使用.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.py
和pyreadstat
来获得相同的结果。您可能会说问题出在数据中,但是使用在线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
答案 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数据集读取器都只会根据数据集中指定的格式进行读取。