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

时间:2017-09-25 04:13:42

标签: python-3.x pandas

我试图在pd.read.csv()函数中找到“na_values ='?'”选项的操作。

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

3 个答案:

答案 0 :(得分:1)

样品:

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_values必需参数NaNdropna

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

答案 1 :(得分:0)

如果要删除包含"?"的行。在pandas数据框中,您可以尝试:

假设您有df

import pandas as pd
df = pd.read_csv('test.csv')

df

    A           B
0   Maths       4/13/2017
1   Physics     4/15/2016
2   English     4/16/2016
3   test?dsfsa  9/15/2016

检查A栏是否包含"?"生成新的df1

df1 = df[df.A.str.contains("\?")==False]

df1将是:

    A       B
0   Maths   4/13/2017
1   Physics 4/15/2016
2   English 4/16/2016

会为您提供新的df1,但不包含"?"。

答案 2 :(得分:0)

na_values = ['NO CLUE', 'N/A', '0']
requests = pd.read_csv('some-data.csv', na_values=na_values)

创建一个无用参数的列表,并通过读取文件使用它