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 对象,以便逐块处理文件。
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())
将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 ,保存
(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
(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
(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
(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