pandas模块使用备忘

前言

其实,如果要详细、专业、熟练的使用一个模块,必须要学习官方文档。

但是,有时候时间紧迫,或者记忆力不太好,所以就有了这篇文档。

这篇文档是为了本人快速的使用pandas提供的简单既要。

如果,这对发现这个文档的你也有帮助,那真是一件令我开心的事情。

一些常用操作

import pandas as pd
ridership_df = pd.DataFrame(
  data=[[  0,  0,  2,  5,  0],
     [1478, 3877, 3674, 2328, 2539],
     [1613, 4088, 3991, 6461, 2691],
     [1560, 3392, 3826, 4787, 2613],
     [1608, 4802, 3932, 4477, 2705],
     [1576, 3933, 3909, 4979, 2685],
     [ 95, 229, 255, 496, 201],
     [  2,  0,  1,  27,  0],
     [1438, 3785, 3589, 4174, 2215],
     [1342, 4043, 4009, 4665, 3033]],
  index=['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',
      '05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11'],
  columns=['R003', 'R004', 'R005', 'R006', 'R007']
)
# 取索引列
ridership_df.index.values
# 取表头行
ridership_df.columns.values
# 将某一列设为索引
ridership_df.set_index('R007')

# DataFrame 更改列名 inplace=True 在原数据上替换,否则返回一个替换过的DataFrame
res = ridership_df.rename(columns={'R003':'a','R004':'b'}, inplace=True) 
# 返回一个新的DataFrame
new_ridership_df = ridership_df.rename(columns={'R003':'a','R004':'b'}, inplace=False)

# 如何获取Dataframe的行数和列数
# 返回列数:
ridership_df.shape[1]
# 返回行数:
ridership_df.shape[0]

'''
pandas 遍历有以下三种访法。 

    iterrows():在单独的变量中返回索引和行项目,但显着较慢 
    itertuples():快于.iterrows(),但将索引与行项目一起返回,ir [0]是索引 
    zip:最快,但不能访问该行的索引

'''
import time
list1 = []
start = time.time()
for i,r in ridership_df.iterrows():
    list1.append((r['a'], r['b']))
print("iterrows耗时  :",time.time()-start)

list1 = []
start = time.time()
for ir in ridership_df.itertuples():
    list1.append((ir[1], ir[2]))    
print("itertuples耗时:",time.time()-start)

list1 = []
start = time.time()
for r in zip(ridership_df['a'], ridership_df['b']):
    list1.append((r[0], r[1]))
print("zip耗时       :",time.time()-start)

读取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, skip_footer=0, doublequote=True, delim_whitespace=False,as_recarray=None, compact_ints=None, use_unsigned=None, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None ...)
'''
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL类型包括:http, ftp, s3和文件

sep : str, default ‘,’
指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’

delimiter : str, default None
定界符,备选分隔符(如果指定该参数,则sep参数失效)

dtype : Type name or dict of column -> type, default None
每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}
'''

写数据库示例

from sqlalchemy import create_engine
# import pdb


def signature(pd_table, conn, keys, data_iter):
    # pdb.set_trace()
    columns = ', '.join('{}'.format(k) for k in keys)
    if pd_table.schema:
        table_name = '{}.{}'.format(pd_table.schema, pd_table.name)
    else:
        table_name = pd_table.name
    # trans = conn.begin()
    for item in data_iter:
        existing = conn.execute(
            f"select * from {table_name} where {keys[-1]} = '{item[-1]}' and {keys[0]} = '{item[0]}' ").first()
        if not existing:
            values = ','.join('"{}"'.format(k) for k in item)
            conn.execute(
                f"insert into {table_name} ({columns}) values({values})")
    # trans.commit()


# 初始化数据库连接,使用pymysql模块
engine = create_engine(
    'mysql+pymysql://wangchenxi:123456@localhost:3306/tushare')
# 查询语句,选出employee表中的所有数据
sql = ''' select code, name from stock_code; '''
# read_sql_query的两个参数: sql语句, 数据库连接
df = pd.read_sql_query(sql, engine)
# 输出employee表的查询结果
stocks = df.loc[:, ['code', 'name']]

e = datetime.datetime.now()
s = e - datetime.timedelta(days=10)

for index, stock in stocks.iterrows():
    d = ts.get_hist_data(code=stock['code'], start=s.strftime(
        '%F'), end=e.strftime('%F'))
    if not hasattr(d, 'iloc'):
        continue
    d['code'] = stock['code']
    # print(d.index)
    # d['date'] = datetime.now().strftime('%F')
    d.to_sql('hist_data', engine, if_exists='append', index=True,
             index_label='date',  method=signature)
    print(f"{stock['name']} 更新历史数据完毕。")

print('write to Mysql table successfully!')

pandas模块文档备查

下面链接中有提供官方文档,以备查询使用。

链接: https://pan.baidu.com/s/1CzDQbVESXRbslSjEXjayqw 提取码: 4r8h


版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创

转载请注明:出处来自王晨曦个人站点 » pandas模块使用备忘

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注