Pandas读取CSV文件主要用到的函数为:pandas.read_csv()
-
函数原型:
-
pandas.read_csv(filepath_or_buffer, sep=
', ', delimiter=
None, header=
'infer',
-
names=
None, index_col=
None, usecols=
None, squeeze=
False,
-
prefix=
None, mangle_dupe_cols=
True, dtype=
None, engine=
None,
-
converters=
None, true_values=
None, false_values=
None,
-
skipinitialspace=
False, skiprows=
None, nrows=
None,
-
na_values=
None, keep_default_na=
True, na_filter=
True,
-
verbose=
False, skip_blank_lines=
True, parse_dates=
False,
-
infer_datetime_format=
False, keep_date_col=
False, date_parser=
None,
-
dayfirst=
False, iterator=
False, chunksize=
None, compression=
'infer',
-
thousands=
None, decimal=
b'.', lineterminator=
None, quotechar=
'"',
-
quoting=
0, escapechar=
None, comment=
None, encoding=
None,
-
dialect=
None, tupleize_cols=
None, error_bad_lines=
True,
-
warn_bad_lines=
True, skipfooter=
0, doublequote=
True,
-
delim_whitespace=
False, low_memory=
True, memory_map=
False,
-
float_precision=
None)
-
-
常用参数:
-
filepath_or_buffer : 类型str,代表CSV文件地址。
-
sep : 类型str, 默认值为‘,’,用于指定分隔符。如果不指定参数,则会尝试使用逗号分隔。
-
header : 类型为int或者int的列表,它指定用来作为列名行号,然后数据从行号的下一行开始读取。 默认情况下header是根据参数names(如下)
-
来推断header的值。如果names为
None,则等价于header=
0,默认把文件中第一行作为列名,数据从第一行开始读取。如果names显示地传入,
-
则等价于header=
None,则数据从
0行开始读取。如果传入header=
0,names不为
None,则将替换原有的列名。header参数可以是一个list。
-
例如:[
0,
1,
3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的
2;
-
本例中的数据
1,
2,
4行将被作为多级标题出现,第
3行数据将被丢弃,dataframe的数据从第
5行开始。)。
-
names : 一个数组, 默认为
None。列名列表,如果数据文件中没有列标题行,就需要执行header=
None。
-
usecols : 一个数组, 默认为
None,返回数据列一个子集。如果传入字符,则列名需要与表中列名对应。如果传入整数列表,则表示列的索引值。
-
例如:usecols有效参数可能是 [
0,
1,
2]或者是 [‘foo’, ‘bar’, ‘baz’]。
-
prefix : 类型str, 默认为
None。在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, ...
-
engine : {‘c’, ‘python’},可选。使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。
-
nrows : 类型int, 默认为
None。需要读取的行数(从文件头开始算起)。
-
iterator : 类型boolean, 默认为
False。返回一个TextFileReader 对象,以便逐块处理文件。
如果CSV文件过大,则可以分块读取CSV文件,比如:
-
import pandas
as pd
-
-
reader = pd.read_csv(
'./train.csv', iterator=
True)
-
try:
-
df = reader.get_chunk(
70000)
# 读取70000行数据
-
except StopIteration:
-
print (
"Iteration is stopped.")
-
print (df.info())
2、DataFrame保存到CSV
将DataFrame保存到CSV文件的函数为:DataFrame.to_csv()
-
函数原型:
-
DataFrame.to_csv(path_or_buf=
None, sep=
', ', na_rep=
'', float_format=
None, columns=
None,
-
header=
True, index=
True, index_label=
None, mode=
'w', encoding=
None,
-
compression=
None, quoting=
None, quotechar=
'"', line_terminator=
'\n',
-
chunksize=
None, tupleize_cols=
None, date_format=
None, doublequote=
True,
-
escapechar=
None, decimal=
'.')
-
常用参数:
-
path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json
-
sep : 输出文件的字段分隔符,默认为 “,”
-
na_rep : 用于替换空数据的字符串,默认为
''
-
float_format : 设置浮点数的格式(几位小数点)
-
columns : 要写的列
-
header : 是否保存列名,默认为
True ,保存
-
index : 是否保存索引,默认为
True ,保存
3、增加DataFrame数据
(1)增加一列数据
-
print df2
-
col1 col2 col3
-
a
1
2
3
-
b
4
5
6
-
-
df2[
'col4'] = [
'cnn',
'rnn']
# 对DataFrame对象进行列扩充
-
print df2
-
col1 col2 col3 col4
-
a
1
2
3 cnn
-
b
4
5
6 rnn
-
-
df2[
'col5'] = pd.DataFrame([
'MachineLearning',
'DeepLearning'],
index=[
'a',
'b'])
-
print df2
# 也可以通过一个新的DataFrame对象来定义一个新列,索引自动对应
-
col1 col2 col3 col4 col5
-
a
1
2
3 cnn MachineLearning
-
b
4
5
6 rnn DeepLearning
-
-
df2[
'col4'] =
1
-
print df2
-
col1 col2 col3 col4
-
a
1
2
3
1
-
b
4
5
6
1
(2)增加一行数据
-
df
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
-
new_line = [
7,
8,
9]
-
df.loc[
3]= new_line
-
print (df)
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
3
7
8
9
但是十分注意的是,这样实际是改的操作,如果 df.loc [index] 中的index已经存在,则新的值会覆盖之前的值。可以使用DataFrame.append()方法添加。例如:
-
df1 = pd.DataFrame([[
1,
2,
3],[
4,
5,
6]],columns=[
'col1',
'col2',
'col3'])
-
df2 = pd.DataFrame([[
7,
8,
9],[
10,
11,
12]],columns=[
'col1',
'col2',
'col3'])
-
print (df1)
-
print (df2)
-
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
col1 col2 col3
-
0
7
8
9
-
1
10
11
12
-
-
df3 = df1.
append(df2, ignore_index=True)
-
df4 = df1.
append(df2)
-
print (df3)
-
print (df4)
-
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
2
7
8
9
-
3
10
11
12
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
0
7
8
9
-
1
10
11
12
4、删除DataFrame数据
(1)删除一列数据del 、DataFrame.drop()
-
del df[
'a']
#删除dataframe中指定的列,这个是直接影响当前的dataframe,注意 del不是函数,是python中的内置语句,没有返回值.
-
-
df.drop([
'a'],axis=
1)
#删除指定的列,与上面的区别是不会影响原来的dataframe,drop方法会返回一个删除了指定列的新的dataframe.
-
-
# 这里如果不加axis=1,则默认是删除行,比如
-
df
-
col1 col2 col3
-
a
1
2
3
-
b
4
5
6
-
c
7
8
9
-
-
df.drop([
'a'], inplace=
True)
-
print (df)
-
col1 col2 col3
-
b
4
5
6
-
c
7
8
9
(2)删除一行数据 DataFrame.drop()
-
df = pd.DataFrame([[
1,
2,
3],[
4,
5,
6],[
7,
8,
9]],columns=[
'col1',
'col2',
'col3'])
-
-
# 如果不设置参数inplace=True,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行。
-
df2 = df.drop([
0,
1])
-
print (df)
-
print (df2)
-
-
col1 col2 col3
-
0
1
2
3
-
1
4
5
6
-
2
7
8
9
-
col1 col2 col3
-
2
7
8
9
-
-
# 如果inplace=True则原有数据块的相应行被删除
-
df.drop([
0,
1], inplace=
True)
-
print (df)
-
-
col1 col2 col3
-
2
7
8
9
5、查询DataFrame数据
(1)根据列名和行索引获取指定列和行
-
df.head(n)
# 获取df中的前n行数据,n不指定,则默认为5
-
df.tail(n)
# 获取df中的后n行数据,n不指定,则默认为5
-
# head 和 tail 返回的是一个新的dataframe,与原来的无关
-
-
df[
'a']
# 按照列名获取指定的列,返回的是一个Series
-
df[:
2]
# 获取前2行数据,效果等同df[0:2],返回的是一个新的dataframe
-
df[
2:
5]
# 获取第3行~5行 这3条记录,返回的是一个新的dataframe
-
df.loc[
'20']
# 获取指定索引的行,返回的是一个Series,loc[]传入的是索引名
-
df.iloc[
3]
# 获取指定序号的行,这里是第4行,iloc[]传入的是行数
-
-
df
-
col1 col2 col3
-
a
1
2
3
-
b
4
5
6
-
c
7
8
9
-
-
# 获取指定行
-
print (df.loc[
'a'])
-
print (df.iloc[
0])
-
col1
1
-
col2
2
-
col3
3
-
Name: a, dtype: int64
-
col1
1
-
col2
2
-
col3
3
-
Name: a, dtype: int64
-
-
# 获取指定列
-
print (df[
'col1'])
-
a
1
-
b
4
-
c
7
-
Name: col1, dtype: int64
-
-
# 获取单个元素
-
print (df.iloc[
0,
1])
-
2
(2)条件查询
-
df
-
col1 col2 col3
-
a
1
2
3
-
b
4
5
6
-
c
7
8
9
-
-
df2 = df.loc[(df[
'col1']>
2)&(df[
'col2']<
7)]
-
print (df2)
-
col1 col2 col3
-
b
4
5
6
-
-
df3 = df[(df[
'col1']>
1) & (df.col2<
8)]
-
print (df3)
-
col1 col2 col3
-
b
4
5
6
6、修改DataFrame数据
(1)遍历数据
-
df
-
col1 col2 col3
-
a
1
2
3
-
b
4
5
6
-
c
7
8
9
-
-
for index,row
in df.iterrows():
-
print (index,row[
0],row[
1],row[
2])
-
a
1
2
3
-
b
4
5
6
-
c
7
8
9
-
-
# 或者
-
for co1,col2,col3
in df.values:
-
print (co1,col2,col3)
-
1
2
3
-
4
5
6
-
7
8
9
-
-
# 或者
-
shape = df.shape
-
for i
in range(shape[
0]):
-
for j
in range(shape[
1]):
-
df.iloc[i,j] =
'hehe'
-
print (df)
-
col1 col2 col3
-
a hehe hehe hehe
-
b hehe hehe hehe
-
c hehe hehe hehe
(2)修改行和修改列
-
df[
'column'] = []
# column在DataFrame中存在,则修改,否则添加新列
-
df.iloc[
index]、df.loc[index_name] = []
# index在DataFrame中存在则修改,不存在则添加
(3)替换值DataFrame.replace()
函数原型:
-
DataFrame.replace(to_replace=
None, value=
None, inplace=
False, limit=
None, regex=
False, method=
'pad', axis=
None)
-
# to_replace: DataFrame中被替换的元素名
-
# value:用于替换DataFrame中和to_replace匹配的值
-
# inplace:如果为true,那么将修改该对象不产生副本
实例:
-
df
-
col2 col1 col3
-
b
4
6
5
-
a
1
3
2
-
c
7
9
8
-
-
df.replace(
9,
'hiudown',inplace=
True)
-
print (df)
-
col2 col1 col3
-
b
4
6
5
-
a
1
3
2
-
c
7 hiudown
8