python-3.x - 如何在 pd.read.csv() 函数中使用 “na_values=' ?'” 选项?

标签 python-3.x pandas

我正在尝试在 pd.read.csv() 函数中查找带有 na_values='?' 选项的操作。

这样我就可以找到包含“?”的行列表值,然后删除该值。

最佳答案

示例:

import pandas as pd
from pandas.compat import StringIO

#test data
temp=u"""id,col1,col2,col3
1,13?,15,14
1,13,15,?
1,12,15,13
2,?,15,?
2,18,15,13
2,18?,15,13"""
#in real data use
#df = pd.read_csv('test.csv')
df = pd.read_csv(StringIO(temp))
print (df)
   id col1  col2 col3
0   1  13?    15   14
1   1   13    15    ?
2   1   12    15   13
3   2    ?    15    ?
4   2   18    15   13
5   2  18?    15   13

如果想要删除带有 ? 的值,这些值是单独的,或者子字符串需要由 str.contains 创建的掩码然后通过 DataFrame.any 检查每行是否至少有一个 True :

print (df.astype(str).apply(lambda x: x.str.contains('?', regex=False)))
      id   col1   col2   col3
0  False   True  False  False
1  False  False  False   True
2  False  False  False  False
3  False   True  False   True
4  False  False  False  False
5  False   True  False  False

m = ~df.astype(str).apply(lambda x: x.str.contains('?', regex=False)).any(axis=1)
print (m)
0    False
1    False
2     True
3    False
4     True
5    False
dtype: bool

df = df[m]
print (df)
   id col1  col2 col3
2   1   12    15   13
4   2   18    15   13

如果只想单独替换只需比较值:

print (df.astype(str) == '?')
      id   col1   col2   col3
0  False  False  False  False
1  False  False  False   True
2  False  False  False  False
3  False   True  False   True
4  False  False  False  False
5  False  False  False  False

m = ~(df.astype(str) == '?').any(axis=1)
print (m)
0     True
1    False
2     True
3    False
4     True
5     True
dtype: bool

df = df[m]
print (df)
   id col1  col2 col3
0   1  13?    15   14
2   1   12    15   13
4   2   18    15   13
5   2  18?    15   13

将所有 ? 替换为 NaN 是必要的参数 na_valuesdropna如果要删除所有带有 NaN 的行:

import pandas as pd
from pandas.compat import StringIO

#test data
temp=u"""id,col1,col2,col3
1,13?,15,14
1,13,15,?
1,12,15,13
2,?,15,?
2,18,15,13
2,18?,15,13"""
#in real data use
#df = pd.read_csv('test.csv', na_values='?')
df = pd.read_csv(StringIO(temp), na_values='?')
print (df)
   id col1  col2  col3
0   1  13?    15  14.0
1   1   13    15   NaN
2   1   12    15  13.0
3   2  NaN    15   NaN
4   2   18    15  13.0
5   2  18?    15  13.0


df = df.dropna()
print (df)
   id col1  col2  col3
0   1  13?    15  14.0
2   1   12    15  13.0
4   2   18    15  13.0
5   2  18?    15  13.0

关于python-3.x - 如何在 pd.read.csv() 函数中使用 “na_values=' ?'” 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46397526/

相关文章:

python-3.x - Gaussian Process Regressor scikit 学习无法识别 'eval_MSE=True'

Python 日期时间过程

python - 遍历一列 Pandas 时获取索引

python - 计算 Pandas 数据框中的数据类型

python - Pandas:通过在现有列之间进行线性插值来创建新列

python - 在 Python 中将 yyyy-mm-dd 转换为 yyyy-ww

python - "NameError: name ' key ' is not definedUnable to display"使用 Bottle 时出错

python - 如何在ThreadPool中等待任何线程?

python - 如何根据输入参数值类型提示函数返回?

python - 匹配 2 个数据帧之间的值并使用用户定义的函数进行更新