pandas-对dataframe的操作,对行列的增加删除修改等操作

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)修改行和修改列 

 
  1. df['column'] = [] # column在DataFrame中存在,则修改,否则添加新列

  2. df.iloc[index]、df.loc[index_name] = [] # index在DataFrame中存在则修改,不存在则添加

(3)替换值DataFrame.replace()

  函数原型:

 
  1. DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)

  2.   # to_replace: DataFrame中被替换的元素名

  3.   # value:用于替换DataFrame中和to_replace匹配的值

  4.   # 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

 

你可能感兴趣的:(python)