pandas主要操作 & 读取数据文件

【转载】

本文原创出处: http://www.cnblogs.com/xiaoxuebiye/p/7223774.html 导入数据: pd.

一、pandas主要操作

1、导入数据:

pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

2、导出数据:

df.to_csv(filename):导出数据到CSV文件
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件

3、创建测试对象:

pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
pd.Series(my_list):从可迭代对象my_list创建一个Series对象
df.index = pd.date_range(‘1900/1/30’, periods=df.shape[0]):增加一个日期索引

4、查看、检查数据:

df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
df.info() :查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

5、数据选取:

df[col]:根据列名,并以Series的形式返回列
df[[col1, col2]]:以DataFrame形式返回多列
df.iloc[0]:按位置选取数据
df.loc[‘index_one’]:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0][0]:返回第一列的第一个元素

6、数据统计:

df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差

7、数据合并:

df1.append(df2):将df2中的行添加到df1的尾部
df.concat([df1,df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how=‘inner’):对df1的列和df2的列执行SQL形式的join

8、数据处理:

df[df[col] > 0.5]:选择col列的值大于0.5的行
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col1, ascending=False):按照列col1降序排列数据 df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
df.apply(np.mean):对DataFrame中的每一列应用函数np.mean
df.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

9、数据清理:

df.duplicated() :判断各行是重复,False为非重复值 df.drop_duplicates():删除重复行
df.fillna(0):用实数0填充na
df.dropna():按行删除缺失数据,使用参数axis=0;按列删除缺失值,使用参数axis=1,how = “all” 全部是NA才删,"any"只要有NA就删除
del df[‘col1’]:直接删除某列
df.drop([‘col1’,……],axis=1):删除指定列,也可以删除指定行
df.rename(index={‘row1’:‘A’},columns ={‘col1’:‘B’}):重命名索引名和列名
df.replace():替换df值,前后值可以用字典表,{‘1’:‘A’,'2:‘B’}
hr_data[‘col1’].map(function):Series.map,对指定列进行函数转换
pd.merge(df1,df2,on=‘col1’,how=‘inner’,sort=True):合并两个df,按照共有的列作内连接(交集),outter为外连接(并集),结果排序。
pd.concat([df1,df2]):多个Series堆叠成多行。
df1.combine_first(df2):用df2的数据补充df1的缺失值NAN。

10、其它操作:

改列名:

方法1 a.columns = [‘a’,‘b’,‘c’]

方法2 a.rename(columns={‘A’:‘a’, ‘B’:‘b’, ‘C’:‘c’}, inplace = True)

插入行列

http://www.jianshu.com/p/7df2593a01ce

相关参考链接:****

参考
http://www.qingpingshan.com/rjbc/dashuju/228593.html

十分钟搞定
http://python.jobbole.com/84416/

官方文档
http://pandas.pydata.org/pandas-docs/stable/index.html

操作索引
https://www.dataquest.io/blog/images/cheat-sheets/pandas-cheat-sheet.pdf

进阶

取数(元素):

取df中某一个具体的数据 iloc index locate 举例 :
print df.iloc[0,0]
print df.iloc[1, 1]
print df.iloc[19, 7]

如果 df 是日期索引 + a,b,c 列名,用 loc locate

df.loc[ ‘2017-01-01’, ‘A’ ]

取数(行):

one_row = df.iloc[4]
one_row2 = df.loc['2013-01-02']
print type(one_row)

取某一行, 取出来后之后的数据类型是 Series 可以 one_row.iloc[1], 再访问 Series 里的数据

print one_row.iloc[1]
print one_row.loc['A']

取数(列):

column2 = df[‘A’]

column2 是一个 Series 类型

print type( column2 )

可访问 列里面的数据
print column2[0]
print column2[‘2013-01-03’]

取数(切片):

行模式切片

dfsub1 = df.iloc[4:5]
print type( dfsub1 )
print dfsub1

dfsub2 = df.loc[‘2013-01-03’:‘2013-01-05’]
print dfsub2

切片的结果 还是df, 而且改变 dfsub, 会同时改变 df

列模式
print ’ get sub by column mode ’
dfsub = df[[‘A’,‘B’]]
print type( dfsub )
print dfsub

子集 row x column
方式一:
print ’ get sub by row X column mode ’
dfsub = df.loc[‘20130102’:‘20130104’, [‘A’, ‘B’]]
print type( dfsub )
print dfsub
方式二
dfsub = df.iloc[ 1:3, 1:3 ]

取数(条件切片):

dfsub = df[ (df.A > 0) and (df.B > 0) ] 结果类型是 df

这个玩意很想数据库里的 select where

送一个特殊条件

print df[ df > 0 ]

行遍历 :

def testForeach():

        df = pd.read_table('D:/run/data/sz002626\_2017-01-04.cvs', encoding='gbk')  # ,header=0
        df = df.sort_index(axis=0, ascending=False)
        df.columns = [1, 2, 3, 4, 5, 6]
        df[7] = 'kong'
        print  df

        # 清洗
        df\[3\] = df\[3\].replace('--', '0.00')
        df\[3\] = df\[3\].astype(float)

        #遍历
        df\[7\] = df.apply(lambda r: dorec(r), axis=1)
        print df
        pass

def dorec(rec):
        if (rec\[3\] > 0):
            return '涨'
        if (rec\[3\] < 0):
            return '跌'
        else:
            return '平'

二、参考:pandas读写数据文件

1、插入相关模块

## snippets -- import pandas
from __future__ import print_function, division
import numpy as np
import pandas as pd
from openpyxl import load_workbook
import os

print(os.listdir('..\D_DataBank\csvdata'))  # 查看当前目前下的文件

2、读取excel、csv文件

##################  snippets -- read_excel_csv

io_='./datas/excel.xls'    # 根据实际需要更新
sheet_name_=0              # 根据实际需要更新
header_=6                  # 根据实际需要,选择相应的行,作为列字段名
usecols_ = None
dtype_ = None
# usecols_ = ['保单号', '批单号', '二级机构代码', '车牌号', '光博分']    # 根据实际需要更新
# dtype_ = {'保单号': 'string','光博分': 'int64'}                       # 根据实际需要调整

my_excel = pd.read_excel(io=io_,sheet_name=sheet_name_,                                 # 指定文件 
                         header=header_, skipfooter =0,usecols=usecols_, dtype=dtype_   # 选择首行,末行,指定列,指定列数据类型
                        )

dtype_dict = dict( my_excel.dtypes)  
print(dtype_dict.keys())                         # 读取列字段名
print({k:str(v) for k,v in dtype_dict.items()})  # 获取每个列字段的格式

my_excel.head()


################ snippets -- read_csv

inputfile_='./datas/csv.csv'  # 根据实际需要更新
sheet_name_=0                 # 根据实际需要更新
header_=6                     # 根据实际需要,选择相应的行,作为列字段名
usecols_ = None
dtype_ = None
# usecols_ = ['保单号', '批单号', '二级机构代码', '车牌号', '光博分']    # 根据实际需要更新
# dtype_ = {'保单号': 'string','光博分': 'int64'}                       # 根据实际需要调整

my_csv = pd.read_csv(filepath_or_buffer=inputfile_,encoding='utf-8',sep=r',	',engine='python',  # 指定文件,编码模式,分隔符,编译方式 
                     header=header_, skipfooter =0,usecols=usecols_, dtype=dtype_                # 选择首行,末行,指定列,指定列数据类型
                     )

dtype_dict = dict( my_csv.dtypes)
print(dtype_dict.keys())                          # 读取列字段名
print({k:str(v) for k,v in dtype_dict.items()})  # 获取每个列字段的格式
# my_csv.to_excel('excel2.xlsx',index=False,)

my_csv.tail()

3、dataframe写入excel文件

## snippets -- dataframe_to_excel

## ------------直接写入一个excel表中
# my_excel.to_excel('to_sheets1.xlsx',index=False,)  #生成新的excel表格,如果之前有,删除重新新建一个表

## ------------写入到多个sheet中(测试未通过)
bookname_='aa.xlsx'     # 根据需要,更新需要写入的excel工作簿路径及文件名
sheetname_='sheet2'           # 根据需要,更新需要写入的sheet名
result2=[('a','2','ss'),('b','2','33'),('c','4','bbb')]    #列表数据
writer = pd.ExcelWriter(bookname_,engine='openpyxl')       #可以向不同的sheet写入数据
book=load_workbook(bookname_)                              #
writer.book = book
df = pd.DataFrame(result2,columns=['xuhao','id','name'])   #列表数据转为数据框
df.to_excel(writer, sheet_name=sheetname_)                 #将数据写入excel中的sheetname_表,sheet_name改变后即是新增一个sheet
writer.save()#保存

##------------在同一个sheet中追加数据 (测试未通过)

result2=[('a','2','ss'),('b','2','33'),('c','4','bbb')]#需要新写入的数据
df = pd.DataFrame(result2,columns=['xuhao','id','name'])#列表数据转为数据框
df1 = pd.DataFrame(pd.read_excel('123.xlsx',sheet_name='aa')) #读取原数据文件和表
writer = pd.ExcelWriter('123.xlsx',engine='openpyxl')
book=load_workbook('123.xlsx')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df_rows = df1.shape[0] #获取原数据的行数
df.to_excel(writer, sheet_name='aa',startrow=df_rows+1, index=False, header=False)#将数据写入excel中的aa表,从第一个空行开始写
writer.save()#保存

4、读、写mysql数据表

# -------------  snippets read_write mysql
# 注:如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成INTEGER型,需要事先转换成int类型(用map,apply函数可以方便的转换)。

# 导入必要模块
import pandas as pd
from sqlalchemy import create_engine
import pymysql

# 初始化数据库连接,使用pymysql模块  '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
# MySQL的用户:root, 密码:root, 端口:3306,数据库:ex
connection_str = 'mysql+pymysql://root:root@localhost:3306/ex'
engine = create_engine(connection_str)

# 根据sql语句,将数据库表中的数据写入DataFrame中
# read_sql_query的两个参数: sql语句, 数据库连接
df = pd.read_sql_query('select * from students', engine)

#  执行sql语句
# conn =engine.connect()
# conn.execute('select * from students')  # 执行sql 语句
# conn.close()

# 将dataframe 数据写入数据表
sql = '''    
    select name,male,age from students     
    union
    select name,male,age from students2
'''
df = pd.read_sql_query(
    sql, engine)  # read_sql_query的两个参数: sql语句, 数据库连接, 将查询结果写入dataframe
df.to_sql('temp__students', engine, index=False,
          if_exists='replace')   # 将dataframe 数据存入临时表
# print(df)

# 将dataframe中数据写添加到数据库表中,如果不存在,则追加,如果存在,则更新

table_name = 'students'   # 需要导入更新的表名称
df = pd.read_sql_query('select * from students2', engine)   # 获得取dataframe 数据
unique_field = ['name', 'male']  # 唯一字段列表,当该列表中字段全部相等时,判断为重复字段

# 将dataframe 表中数据,添加到数据库表table_name中,按照指定字段decide replace or append


def replace_into_table(engine, table_name, df, unique_field):
    '''
        # engine 为数据库的连接
        # table_name 为被追加或更新的数据表
        # df 为拟追加或更新到table_name 的dataframe 数据,
        # unique_field 为唯一字段列表
    '''
    conn = engine.connect()  # 建立与数据库的连接
    #  --  生成临时表,用于存储dataframe 数据
    try:
        conn.execute('drop table temp__%s' % (table_name))   # 删除临时表
    except:
        pass
        print('Unknown table \'temp__%s\'' %
              (table_name))   # 如果,临时表不存在,打印临时表不存在提示信息
    conn.execute('create table temp__%s like %s' %
                 (table_name, table_name))  # 创建临时表,用于查询,并删除被更新表中在临时表中存在记录

    #  --  并将dataframe 数据写入临时表
    df.to_sql('temp__%s' % (table_name), engine,
              index=False, if_exists='append')

    # --  删除被更新表中的重复项 & 删除临时表
    unique_field_rep = ','.join(
        list(map(lambda x: 'rep_.'+x, unique_field)))     # 被更新表的唯一字段字符串
    unique_field_temp = ','.join(
        list(map(lambda x: 'temp_.'+x, unique_field)))    # 拟导入临时表的唯一字段字符串

    del_re_sql = 'delete from %s rep_ where (%s) in (select %s from temp__%s temp_)' % (
        table_name, unique_field_rep, unique_field_temp, table_name)         # 将被更新表中,存在于拟导入表中的记录删除的sql语句
    conn.execute(del_re_sql)   # 执行删除重复项操作
    conn.execute('drop table temp__%s' % (table_name))  # 执行sql,删除临时表
    conn.close()  # 关闭连接

    # --  将dataframe表中数据写入到 table_name表中
    df.to_sql(table_name, engine, index=False, if_exists='append')


replace_into_table(engine, table_name, df, unique_field)  # 执行程序
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值