在 Python DataFrame 中将 NaN 响应更改为零的风险
Risks re changing NaN responses to zero in Python DataFrame
我有一个很大的调查数据集要清理(300 列,30000 行)并且列是混合的。我将 Python 与 pandas 和 numpy 一起使用。我非常处于使用 Python 的学习轮阶段。
- 一些栏目有 Y 或 N 个问题的答案(这些已填写 "Y" 或 "N")。
- 有些是李克特量表问题,有 5 个可能的答案。在 CSV 文件中,每个答案(同意、不同意等)都有自己的列。这已导入为 1 表示是,否则为 NaN。
- 其他问题最多有 10 个可能的答案(例如年龄),这些问题已作为字符串导入到一列中 - 即 "a. 0-18" 或 "b. 19-25" 等等。改变这些会很有趣!
我正在将 Y/N 的答案更改为 1 或 0。但是,对于李克特量表列,我担心做同样的事情可能会有风险。有没有人认为暂时将这些数据保留为 NaN 是否更可取?性别是相同的——男性有一个单独的列,女性有一个单独的列,两者都用 1 表示是,用 NaN 表示否。
我打算将 Python 用于数据 analysis/charting(将导入 matplotlib 和 seaborn)。由于这对我来说是新的,我猜测我现在所做的更改可能会在以后产生意想不到的后果!
如果您能提供任何指导,我们将不胜感激。
提前致谢。
如果 0 没有任何意义,可以用一个值填充 NA(为方便起见,0)。这完全取决于您的数据。也就是说,300 x 30k 并没有那么大。将其保存为 CSV 文件,然后在 IPython Notebook 中进行实验,Pandas 可能会在一秒钟内读取它,所以如果你搞砸了,只需重新加载。
这里有一小段代码,可以将任何多列问题集压缩成具有某个数字的单列:
df = pd.DataFrame({
1: {'agree': 1},
2: {'disagree': 1},
3: {'whatevs': 1},
4: {'whatevs': 1}}).transpose()
df
question_sets = {
'set_1': ['disagree', 'whatevs', 'agree'], # define these lists from 1 to whatever
}
for setname, setcols in question_sets.items():
# plug the NaNs with 0
df[setcols].fillna(0)
# scale each column with 0 or 1 in the question set with an ascending value
for val, col in enumerate(setcols, start=1):
df[col] *= val
# create new column by summing all the question set columns
df[setname] = df[question_set_columns].sum(axis=1)
# delete all the old columns
df.drop(setcols, inplace=True, axis=1)
df
我有一个很大的调查数据集要清理(300 列,30000 行)并且列是混合的。我将 Python 与 pandas 和 numpy 一起使用。我非常处于使用 Python 的学习轮阶段。
- 一些栏目有 Y 或 N 个问题的答案(这些已填写 "Y" 或 "N")。
- 有些是李克特量表问题,有 5 个可能的答案。在 CSV 文件中,每个答案(同意、不同意等)都有自己的列。这已导入为 1 表示是,否则为 NaN。
- 其他问题最多有 10 个可能的答案(例如年龄),这些问题已作为字符串导入到一列中 - 即 "a. 0-18" 或 "b. 19-25" 等等。改变这些会很有趣!
我正在将 Y/N 的答案更改为 1 或 0。但是,对于李克特量表列,我担心做同样的事情可能会有风险。有没有人认为暂时将这些数据保留为 NaN 是否更可取?性别是相同的——男性有一个单独的列,女性有一个单独的列,两者都用 1 表示是,用 NaN 表示否。
我打算将 Python 用于数据 analysis/charting(将导入 matplotlib 和 seaborn)。由于这对我来说是新的,我猜测我现在所做的更改可能会在以后产生意想不到的后果!
如果您能提供任何指导,我们将不胜感激。
提前致谢。
如果 0 没有任何意义,可以用一个值填充 NA(为方便起见,0)。这完全取决于您的数据。也就是说,300 x 30k 并没有那么大。将其保存为 CSV 文件,然后在 IPython Notebook 中进行实验,Pandas 可能会在一秒钟内读取它,所以如果你搞砸了,只需重新加载。
这里有一小段代码,可以将任何多列问题集压缩成具有某个数字的单列:
df = pd.DataFrame({
1: {'agree': 1},
2: {'disagree': 1},
3: {'whatevs': 1},
4: {'whatevs': 1}}).transpose()
df
question_sets = {
'set_1': ['disagree', 'whatevs', 'agree'], # define these lists from 1 to whatever
}
for setname, setcols in question_sets.items():
# plug the NaNs with 0
df[setcols].fillna(0)
# scale each column with 0 or 1 in the question set with an ascending value
for val, col in enumerate(setcols, start=1):
df[col] *= val
# create new column by summing all the question set columns
df[setname] = df[question_set_columns].sum(axis=1)
# delete all the old columns
df.drop(setcols, inplace=True, axis=1)
df