pd.read_csv()参数

filepath_or_buffer : various   文件路径
sep 以什么分割
delimiter : str, default None   以什么分割默认为none
delim_whitespace : boolean, default False   Equivalent to setting sep='\s+'
header : int or list of ints, default 'infer'   header=0表示文件的第一行
也可以写header=[1,2,3]当列名   要是没有列名可以这样header=None一般和names用在一起
names 表示用的列名用列表来装,最好不要有重复值,别忘记rename方法
index_col : int or sequence or False, default None  指定那一列作为行的索引,可以是数字可以是列表,要是最后有分隔符的话可以把index_col=False
usecols : list-like or callable, default None    返回给的列表的子集,需要看你自己想要哪一列的数据,如   usecols=[1, 5]只会读取第一和第5列,也可以是自己定义的列名
from pandas.compat import StringIO, BytesIO
data = ('col1,col2,col3\n''a,b,1\n''a,b,2\n''c,d,3')
pd.read_csv(StringIO(data))
squeeze : boolean, default False  解析的数据如果只返回1列则返回Series
prefix : str, default None 在没有标题的时候添加列号的前缀, 你可以这样用header=None, prefix='x'
mangle_dupe_cols : boolean, default True   把重复的列设置为X’, ‘X.1’…’X.N’
dtype : Type name or dict of column -> type, default None
dtype : Type name or dict of column -> type, default None 读取数据的时候设置各个列的不同的类型
可以是这样{'a': str}, str
engine : {'c', 'python'}   支持的引擎,c 的引擎是最快的但是python引擎兼容性更强
converters : dict, default None  在某一列中转换值我的用法是converters={'col1': lambda x: x.upper()}  感觉和apply用起来差不多
true_values : list, default None   把列表中的值设置为True
false_values    把列表中的值设置为False 例如   false_false=['我'] 就会把是‘我’的字全部变为False
skipinitialspace : boolean, default False  跳过分隔符后的空格
skiprows : list-like or integer, default None   跳过开头的几行
pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)
skipfooter : int, default 0
nrows   用来读取的文件的行数一般用来读取大文件时候用的
memory_map : boolean, default False   如果为filepath_或_缓冲区提供了filepath,请将文件对象直接映射到内存中,并从内存中直接访问数据。使用此选项可以提高性能,因为不再有任何I/O开销。
na_values : scalar, str, list-like, or dict, default None  把什么值设置为Nan比如吧bat设置为Nan值可以这样na_values=['bat]
keep_default_na : boolean, default True

na_filter : boolean, default True  如果=False 前面2项设置无效
在没有na值的文件里面=False可以提高大型文件的读取速度
verbose : boolean, default False
skip_blank_lines : boolean, default True  如果为真,则跳过空行,而不是将其解释为NaN值。
parse_dates : boolean or list of ints or names or list of lists or dict, default False.
If True -> try parsing the index.    会自动分析日期
If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a separate date column.
If [[1, 3]] -> combine columns 1 and 3 and parse as a single date column.
If {'foo': [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’. A fast-path exists for iso8601-formatted dates.
infer_datetime_format : boolean, default False
If True and parse_dates is enabled for a column, attempt to infer the datetime format to speed up the processing.
keep_date_col : boolean, default False
If True and parse_dates specifies combining multiple columns then keep the original columns.
date_parser : function, default None
dayfirst : boolean, default False
DD/MM format dates, international and European format.
iterator : boolean, default False 返回textfileReader对象进行迭代或使用get_chunk()获取块。
chunksize : int, default None
compression : {'infer', 'gzip', 'bz2', 'zip', 'xz', None}, default 'infer'}
用于动态解压缩磁盘上的数据。如果filepath_或_buffer是分别以“.gz”、“.bz2”、“.zip”或“.xz”结尾的字符串,则使用gzip、bz2、zip或xz,否则不进行解压缩。如果使用“zip”,则zip文件只能包含一个要读取的数据文件。设置为“None”表示无解压缩。
thousands : str, default None  千位分隔符
decimal : str, default '.'
要识别为小数点的字符。例如,使用“,”作为欧洲数据。
float_precision : string, default None
comment : str, default None
encoding : str, default None
error_bad_lines : boolean, default True    是否跳过错误的行  默认是不跳过2
warn_bad_lines : boolean, default True
df['col_1'].apply(type).value_counts()
df2['col_1'] = pd.to_numeric(df2['col_1'], errors='coerce')
最后,如何处理包含混合数据类型的列中的读取取决于您的特定需求。在上面的例子中,如果您想消除数据异常,那么使用to_numeric()可能是您的最佳选择。但是,如果您希望强制所有数据,不管是哪种类型,那么使用read_csv()的converters参数肯定是值得尝试的。
rom pandas.api.types import CategoricalDtype
dtype = CategoricalDtype(['a', 'b', 'd'])  # No 'c'
pd.read_csv(StringIO(data), dtype={'col1': dtype}).col1
df['col3'].cat.categories = pd.to_numeric(df['col3'].cat.categories)
pd.read_csv(StringIO(data), usecols=[0, 2, 3])
pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ['A', 'C'])
pd.read_csv(StringIO(data), usecols=lambda x: x not in ['a', 'c'])
忽略行注释和空行
data = ('\n'
   ....:         'a,b,c\n'
   ....:         '  \n'
   ....:         '# commented line\n'
   ....:         '1,2,3\n'
   ....:         '\n'
   ....:         '4,5,6')
pd.read_csv(StringIO(data), comment='#')
If skip_blank_lines=False, then read_csv will not ignore blank lines:
data = ('a,b,c\n'
   ....:         '\n'
   ....:         '1,2,3\n'
   ....:         '\n'
   ....:         '\n'
   ....:         '4,5,6')
pd.read_csv(StringIO(data), skip_blank_lines=False)
data = ('#comment\n'
   ....:         'a,b,c\n'
   ....:         'A,B,C\n'
   ....:         '1,2,3')
 pd.read_csv(StringIO(data), comment='#', header=1)
data = ('A,B,C\n'
   ....:         '#comment\n'
   ....:         'a,b,c\n'
   ....:         '1,2,3')
pd.read_csv(StringIO(data), comment='#', skiprows=2)
data = ('# empty\n'
   ....:         '# second empty line\n'
   ....:         '# third emptyline\n'
   ....:         'X,Y,Z\n'
   ....:         '1,2,3\n'
   ....:         'A,B,C\n'
   ....:         '1,2.,4.\n'
   ....:         '5.,NaN,10.0\n')
pd.read_csv(StringIO(data), comment='#', skiprows=4, header=1)
当文件在每个数据行的末尾都准备了分隔符时,会出现一些异常情况,这会混淆解析器。若要显式禁用索引列推理并放弃最后一列,请通过index_col=False:
 pd.read_csv(StringIO(data), index_col=False)
 df = pd.read_csv('foo.csv', index_col=0, parse_dates=True)
KORD,19990127, 19:00:00, 18:56:00, 0.8100
KORD,19990127, 20:00:00, 19:56:00, 0.0100
KORD,19990127, 21:00:00, 20:56:00, -0.5900
KORD,19990127, 21:00:00, 21:18:00, -0.9900
KORD,19990127, 22:00:00, 21:56:00, -0.5900
KORD,19990127, 23:00:00, 22:56:00, -0.5900
df = pd.read_csv('tmp.csv', header=None, parse_dates=[[1, 2], [1, 3]])
                  1_2                 1_3     0     4
0 1999-01-27 19:00:00 1999-01-27 18:56:00  KORD  0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00  KORD  0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00  KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00  KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00  KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00  KORD -0.59
df = pd.read_csv('tmp.csv', header=None, parse_dates=[[1, 2], [1, 3]],keep_date_col=True)
默认情况下,解析器会删除组件日期列,但您可以通过“保留日期”列选择保留它们。
df = pd.read_csv('tmp.csv', header=None, parse_dates=[[1, 2], [1, 3]],keep_date_col=True)
                  1_2                 1_3     0         1          2          3     4
0 1999-01-27 19:00:00 1999-01-27 18:56:00  KORD  19990127   19:00:00   18:56:00  0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00  KORD  19990127   20:00:00   19:56:00  0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00  KORD  19990127   21:00:00   20:56:00 -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00  KORD  19990127   21:00:00   21:18:00 -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00  KORD  19990127   22:00:00   21:56:00 -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00  KORD  19990127   23:00:00   22:56:00 -0.59
请注意,如果要将多个列合并为单个日期列,则必须使用嵌套列表。换言之,parse_dates=[1,2]表示第二列和第三列应分别分析为单独的日期列,parse_dates=[[1,2]]表示两列应分析为单个列。
date_spec = {'nominal': [1, 2], 'actual': [1, 3]}
df = pd.read_csv('tmp.csv', header=None, parse_dates=date_spec)
              nominal              actual     0     4
0 1999-01-27 19:00:00 1999-01-27 18:56:00  KORD  0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00  KORD  0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00  KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00  KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00  KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00  KORD -0.59
date_spec = {'nominal': [1, 2], 'actual': [1, 3]}
重要的是要记住,如果要将多个文本列解析为单个日期列,则数据前面会有一个新列。索引列规范基于这组新列,而不是原始数据列:
df = pd.read_csv('tmp.csv', header=None, parse_dates=date_spec,index_col=0)
                             actual     0     4
nominal                                            
1999-01-27 19:00:00 1999-01-27 18:56:00  KORD  0.81
1999-01-27 20:00:00 1999-01-27 19:56:00  KORD  0.01
1999-01-27 21:00:00 1999-01-27 20:56:00  KORD -0.59
1999-01-27 21:00:00 1999-01-27 21:18:00  KORD -0.99
1999-01-27 22:00:00 1999-01-27 21:56:00  KORD -0.59
1999-01-27 23:00:00 1999-01-27 22:56:00  KORD -0.59
可以自己定义时间日期解析函数,以保证数据的灵活性
df = pd.read_csv('tmp.csv', header=None, parse_dates=date_spec,date_parser=pd.io.date_converters.parse_date_time)
              nominal              actual     0     4
0 1999-01-27 19:00:00 1999-01-27 18:56:00  KORD  0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00  KORD  0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00  KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00  KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00  KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00  KORD -0.59
If you know the format, use pd.to_datetime(): date_parser=lambda x: pd.to_datetime(x, format=...).
0    2000-01-01 00:00:00+05:00
1    2000-01-01 00:00:00+06:00
df = pd.read_csv(StringIO(content), parse_dates=['a'],date_parser=lambda col: pd.to_datetime(col, utc=True))
0   1999-12-31 19:00:00+00:00
1   1999-12-31 18:00:00+00:00
Name: a, dtype: datetime64[ns, UTC]
请注意,推断日期时间格式对dayFirst敏感。如果dayFirst=true,则猜测“01/12/2011”为12月1日。如果dayFirst=false(默认),则猜测“01/12/2011”为1月12日。
df = pd.read_csv('foo.csv', index_col=0, parse_dates=True,infer_datetime_format=True)
            A  B  C
date               
2009-01-01  a  1  2
2009-01-02  b  3  4
2009-01-03  c  4  5
val = '0.3066101993807095471566981359501369297504425048828125'
data = 'a,b,c\n1,2,{0}'.format(val)
abs(pd.read_csv(StringIO(data), engine='c',float_precision=None)['c'][0] - float(val))
默认情况下,带有千位分隔符的数字将被分析为字符串:
df = pd.read_csv('tmp.csv', sep='|')
         ID      level category
0  Patient1    123,000        x
1  Patient2     23,000        y
2  Patient3  1,234,018        z
pd.read_csv('path_to_file.csv', na_values=[5])
pd.read_csv('path_to_file.csv', keep_default_na=False, na_values=[""])  只有一个空字段才会设置为Nan的值
pd.read_csv('path_to_file.csv', keep_default_na=False, na_values=["NA", "0"])
pd.read_csv('path_to_file.csv', na_values=["Nope"])
类似inf的值将被解析为np.inf(正无穷大),而-inf将被解析为-np.inf(负无穷大)。这些将忽略值的大小写,即inf,也将被解析为np.inf。
某些文件的行格式可能不正确,字段太少或太多。字段太少的行将在尾部字段中填充NA值。字段太多的行将在默认情况下引发错误:
解决方法You can elect to skip bad lines:
# data = ('a,b,c\n''1,2,3\n''4,5,6,7\n''8,9,10')
pd.read_csv(StringIO(data), error_bad_lines=False)
df = pd.read_csv(StringIO(data))
pd.read_csv(StringIO(data), usecols=[0, 1, 2])
Dialect  感觉是解析方法把,我也不懂
import csv
dia = csv.excel()
dia.quoting = csv.QUOTE_NONE
pd.read_csv(StringIO(data), dialect=dia)
pd.read_csv(StringIO(data), skipinitialspace=True)    跳过分隔符后面的空格
data = 'a,b\n"hello, \\"Bob\\", nice to see you",5'
pd.read_csv(StringIO(data), escapechar='\\')
df = pd.read_csv('foo.csv', parse_dates=True)   # 可以自动分析日期
pd.read_csv('mi.csv', header=[0, 1, 2, 3], index_col=[0, 1])
df = pd.read_csv('D:/data/20190704_mvs.csv', sep=None, engine='python', encoding='utf-8')
可以自动的嗅探分割符号
reader = pd.read_csv('tmp.sv', sep='|', iterator=True)
reader.get_chunk(5)

 

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值