目录
3.1 pandas对excel、csv文件的读写操作
3.2 pandas对数据的操作
3.3 pandas实现对数据的筛选
3.4 删除数据
在python
中,读写excel
数据方法很多,比如xlrd
、xlwt
和openpyxl
,实际上限制比较多,不是很方便。比如openpyxl
也不支持csv格式
。
更好的方法可以使用pandas
,虽然pandas
不是专门处理excel
数据,但处理excel
数据更方便。
在进行pandas操作前,可以先设置pandas显示的行和列:
#显示所有列 pd.set_option('display.max_columns', None) #显示所有行 pd.set_option('display.max_rows', None) #设置value的显示长度为100,默认为50 pd.set_option('max_colwidth',100)
import pandas as pd
# df是pandas.core.frame.DataFrame类型,读取excel文件
df = pd.read_excel('./data.xlsx')
print(df) #打印文件
# read_csv可以指定分割符,编码方式等
#读取csv文件
df2 = pd.read_csv('data.csv')
print(df2) #打印文件
按照列名打印数据,每一列为一个Series,会将索引打印出来,使用values属性可以得到其值,使用index可以得到索引:
#得到列名
all_col = df.columns
print(list(all_col))
#按照每列获取数据
for key in list(all_col):
print(key)
print(df[f'{key}'].values)
print(df[f'{key}'].index)
通过loc函数索引,loc函数定位的是标签(index),不是行的位置。loc函数的第一个参数是对行的操作,第二个参数是对列的操作。
#获取标签数据
print(df.loc[1])
print(df.loc[1:3])
iloc函数定位的是行的位置。iloc函数的第一个参数是对行的操作,第二个参数是对列的操作。
#按照位置获取行数据
print(df.iloc[[1,3],[2,5]]) #第一个参数是行,第二个参数是列,获取1和3行数据
print(df.iloc[1:3])
所以可以使用iloc获取excel单元格的数据:
#获取单元格数据
print(df.iloc[0][0])
pandas中的contains方法可以实现对数据的筛选
包含一个值,na表示是否需要填充,case表示是否区分大小写,更强大的是contains还支持正则表达式
sub_df = df[ df[col_name].str.contains('key1', na=False, case=False) ]
# 包含多个值,多次调用即可
sub_df1 = df[ df[col_name].str.contains('key1', na=False, case=False) ]
sub_df2 = sub_df1[ sub_df1[col_name].str.contains('key2', na=False, case=False) ]
# 包含多个值(或) sub_df = df[ df[col_name].str.contains('key1|key2|key3', na=False, case=False) ]
# 不包含,也就是非的过滤
sub_df = df[ ~df[col_name].str.contains('key1', na=False, case=False) ]
条件过滤,筛选某列的数据:
# 包含一个值,na表示是否需要填充,case表示是否区分大小写,更强大的是contains还支持正则表达式
print(df[df['2015 总分'] > 1.5]) #筛选大于1.5的每行数据
#返回布尔值
print(df['2015 总分'] > 1.5)
写入一行数据:
# 插在最后,row_datas是list
df.loc[len(df.index)] = row_datas
写入一列数据:
# 在指定列前面插上一列数据
df.insert( col_index, col_name, col_datas, True)
更新数据:
#更新某个单元值
df.iloc[row][col] = u'new-data'
axis = 1 指定删除一列数据
print(df.drop('2015 总分',axis=1, inplace=False))
axis = 0 指定删除一行数据
print(len(df)) #函数
print(df.drop(1,axis=0, inplace=False))
print(len(df.drop(1,axis=0, inplace=False)))