处理 "NA" 作为缺失值和序数特征值
dealing with "NA" as both missing value and ordinal feature value
我有一个包含大约 80 个特征的 .txt
数据集,其中 "NA"
既用作缺失值的指示符,又用作特定序数字符串特征的实际值,如:
处理此问题的最佳方法是什么?
默认情况下,pandas 将这些 "NA"
值转换为 "nan"
。我阅读了如何通过从列表 na_vals
中删除 "NA"
来停止此操作,如下所示:
na_vals = ['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A', 'N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']
na_vals.remove("NA")
data = pd.read_table('data/AmesHousing.txt', delimiter="\t", keep_default_na=False, na_values=na_vals)
但是,对于 "NA"
不是可能值的每个特征,我是否应该手动将 "NA"
值替换为 "nan"
?如果是这样,这是怎么做到的?如果没有,这样做的更好方法是什么?谢谢!
编辑:我应该澄清一下,我假设 "NA"
也用于缺失值,因为如果我从中删除 "NA"
na_values
列表,data.isnull().sum().sum()
returns 0
。所以我想要么我的假设是正确的,要么整个数据集中实际上没有缺失值。我不确定如何确定其中哪一个是真的。 The dataset description page can be found here.
在Jupyter
中我使用%%writefile
魔法设置了一个测试文件。如果您已经有一个文件,则不需要这样做。
%%writefile test.csv
col1,col2,col3
Ex,1.,2.
Gd,3.,4.
TA,5.,NA
NA,6.,7.
解决方案
解析两次,要求我知道具有合法 'NA'
值的列的名称。确保使用与您相关的列名称填充列表。
cols_with_legit_NA = ['col1']
legit_df = pd.read_csv(
'test.csv',
usecols=cols_with_legit_NA,
keep_default_na=False
)
df = pd.read_csv('test.csv').assign(**legit_df)
df
col1 col2 col3
0 Ex 1.0 2.0
1 Gd 3.0 4.0
2 TA 5.0 NaN
3 NA 6.0 7.0
我有一个包含大约 80 个特征的 .txt
数据集,其中 "NA"
既用作缺失值的指示符,又用作特定序数字符串特征的实际值,如:
处理此问题的最佳方法是什么?
默认情况下,pandas 将这些 "NA"
值转换为 "nan"
。我阅读了如何通过从列表 na_vals
中删除 "NA"
来停止此操作,如下所示:
na_vals = ['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A', 'N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']
na_vals.remove("NA")
data = pd.read_table('data/AmesHousing.txt', delimiter="\t", keep_default_na=False, na_values=na_vals)
但是,对于 "NA"
不是可能值的每个特征,我是否应该手动将 "NA"
值替换为 "nan"
?如果是这样,这是怎么做到的?如果没有,这样做的更好方法是什么?谢谢!
编辑:我应该澄清一下,我假设 "NA"
也用于缺失值,因为如果我从中删除 "NA"
na_values
列表,data.isnull().sum().sum()
returns 0
。所以我想要么我的假设是正确的,要么整个数据集中实际上没有缺失值。我不确定如何确定其中哪一个是真的。 The dataset description page can be found here.
在Jupyter
中我使用%%writefile
魔法设置了一个测试文件。如果您已经有一个文件,则不需要这样做。
%%writefile test.csv
col1,col2,col3
Ex,1.,2.
Gd,3.,4.
TA,5.,NA
NA,6.,7.
解决方案
解析两次,要求我知道具有合法 'NA'
值的列的名称。确保使用与您相关的列名称填充列表。
cols_with_legit_NA = ['col1']
legit_df = pd.read_csv(
'test.csv',
usecols=cols_with_legit_NA,
keep_default_na=False
)
df = pd.read_csv('test.csv').assign(**legit_df)
df
col1 col2 col3
0 Ex 1.0 2.0
1 Gd 3.0 4.0
2 TA 5.0 NaN
3 NA 6.0 7.0