我爱编程

pandas学习

2018-04-18  本文已影响0人  chliar
import pandas as pd

a = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
# print a[1:3]
c = pd.Series(10, index=['a', 'b', 'c'])  #  自定义索引  默认索引也是存在
print c
类型为 <class 'pandas.core.series.Series'>

###########################################################
#切割字符,split()获取下标为1的
data['jobcreate']=data['jobcreate'].str.split(' ',).str.get(1)
字符串方法

Series对象在其str属性中配备了一组字符串处理方法,可以很容易的应用到数组中的每个元素

t = pd.Series(['a_b_c_d','c_d_e',np.nan,'f_g_h'])
t

t.str.cat(['A','B','C','D'],sep=',') #拼接字符串

t.str.split('_') #切分字符串

t.str.get(0) #获取指定位置的字符串

t.str.replace("_", ".") #替换字符串

t.str.pad(10, fillchar="?") #左补齐
t.str.pad(10, side="right", fillchar="?") #右补齐
t.str.center(10, fillchar="?") #中间补齐

t.str.find('d') #查找给定字符串的位置,左边开始
t.str.rfind('d') #查找给定字符串的位置,右边开始

lambda 函数:
df['compname'] = df['compname'].apply(lambda x: x.replace('',''))
###################################################
去重:
df.duplicate(subset=u'公司名称')   可以查看 公司名这一列的字段重复值,不传值则按照整一行的数值全部相同才算重复
删除重复值:
df = df.drop_duplicates(subset=u'公司名称')
print df
###################################################
df['Director'].unique() 去重之后是列表
df.str.split(',').str.get(0) #取切片后的第0个下标的值
df['genre'].str.split(',').tolist() # 整个值变成一个大列表里有很多小列表

查询:
df[df[u'薪资'].str.contains('-')]
data = data[data.classify.str.contains('1', na=False)]
na = False 可以忽略空值
查询薪资的字段中包含'-' 的所有行

##############################################################
pandas 绘图

import pymysql
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置
plt.rcParams['axes.unicode_minus'] = False

sql_pd = """SELECT ljn.city,ljn.last_date,ljn.nums FROM (SELECT * FROM(SELECT * FROM (select a.city,a.last_date,a.use_type,count(*) nums,format(avg(case when a.avg_price like '% 元/平(均价)%' then a.avg_price else null end),2) avg_price from (
select b.city,b.name,b.area,b.locate,b.use_type,max(b.avg_price) as avg_price,min(substr(b.time,1,10)) as last_date from lw_lianjia_realty b group by b.city,b.name,b.area,b.locate,b.use_type) a
group by a.city,a.last_date,a.use_type order by 1,2) as lw WHERE lw.last_date BETWEEN  (select DATE_ADD(CURDATE(),INTERVAL -25 DAY)) and CURDATE() and lw.use_type='住宅')
 AS lw WHERE lw.city IN('北京','深圳','广州','上海'))AS ljn """


sql_avg = """SELECT ljn.city,ljn.last_date,ljn.avg_price FROM (SELECT * FROM(SELECT * FROM (select a.city,a.last_date,a.use_type,count(*) nums,format(avg(case when a.avg_price like '% 元/平(均价)%' then a.avg_price else null end),2) avg_price from (
select b.city,b.name,b.area,b.locate,b.use_type,max(b.avg_price) as avg_price,min(substr(b.time,1,10)) as last_date from lw_lianjia_realty b group by b.city,b.name,b.area,b.locate,b.use_type) a
group by a.city,a.last_date,a.use_type order by 1,2) as lw WHERE lw.last_date BETWEEN  (select DATE_ADD(CURDATE(),INTERVAL -25 DAY)) and CURDATE() and lw.use_type='住宅')
 AS lw WHERE lw.city IN('北京','深圳','广州','上海'))AS ljn """


def get_pd(sql):
    conn = pymysql.connect(host='', user='', passwd='', db='', charset='utf8')
    df = pd.read_sql(sql, conn, )
    conn.close()
    return df


if __name__ == '__main__':
    avg_price = get_pd(sql_avg)
    avg_price['avg_price'] = avg_price['avg_price'].str.replace(u',', '').astype(np.float)
    print()
    avg_price_a = avg_price.pivot(index='last_date', columns='city', values='avg_price')
    avg_price_a = pd.DataFrame(avg_price_a)
    avg_price_a.columns.name = None
    avg_price_a.index.name = None
    plt.xlabel(u'周/城市')
    plt.ylabel(u'均价')
    plt.title(u'新增楼盘表')
    avg_price_a.plot(kind='bar')
    plt.xticks(rotation=0)
    plt.show()
##############################################################
存mongod 
for index, row in data.iterrows():   # 获取每行的index、row  
        for col_name in data.columns:  
            row[col_name] = exp(row[col_name]) # 把指数结果返回给data  
    return data 

from pymongo import MongoClient
import pandas as pd
from sqlalchemy import create_engine
import json

db = MongoClient(host='192.1.64.101', port=27017)


# print db.ark_lab
# db = db['ark_lab'].get_collection('comp_anna_wind_weekly')
# datas = list(db.find({}))
#
# df = pd.DataFrame(datas)
# df = df.drop([u'_id'], axis=1)
# data = df.T.to_dict()
class sql():
    def __init__(self, ):
        self.user = ''
        self.passwd = ''
        self.host = ''
        self.db = ''
        sql = """mysql+pymysql://{}:{}@{}:3306/{}?charset=utf8"""
        self.engine = create_engine(sql.format(self.user, self.passwd, self.host, self.db), encoding='utf-8')
        self.client = MongoClient(host='192.1.64.119', port=27017, )

    def select(self):
        df = pd.read_sql_table(table_name='cxf_lagou_weekly', con=self.engine)
        return df

    def m_insert(self, sql=None, table_name=None, df=None, ):
        client = self.client
        db = client['question']
        data = json.loads(df.T.to_json()).values()
        data = list(data)
        # for i in data:
            # db.lagou.update(i, {"$set": i}, True)
            # db.lagou.update(i, {"$set": i}, True, True)
        print(data)
        # db.lagou.insert(data)
        # db.getCollection(table_name).insert(data)

        client.close()

    def m_select(self, dict):
        client = self.client
        db = client['question']
        data = db.lagou.find(dict)
        return len(list(data))


#手动创建pd:
 pdlist=getpd("""select * from tianyancha_holdingcompany""")

 pdlist['关联公司'][0]   #   先取[columns]在取[index]  不能先取index在取columns

#所以要转过来:
 data = pd.DataFrame([[x for x in pdlist['公司名称']], [x for x in pdlist['关联公司']]], index=['公司名称', '关联公司'])
    for i in range(len(data.columns)):
        # print(i)
        print(data[i]['公司名称'], data[i]['关联公司'])

##########################################
dataNumPy = np.asarray([(1,2,3,4)])
df = pd.DataFrame(dataNumPy, columns=['1','2','3','4'])
#统计的对应关系:
   city   last_date  avg_price
0    上海  2018-03-26   36400.00
1    上海  2018-04-02   50514.29
2    上海  2018-04-09   27166.67
3    上海  2018-04-16   29350.00
4    北京  2018-03-26   16500.00
5    北京  2018-04-02   62333.33
6    北京  2018-04-09   80000.00
7    北京  2018-04-16   43666.67
8    广州  2018-03-26   12000.00
9    广州  2018-04-02   15333.33
10   广州  2018-04-09   16066.67
11   广州  2018-04-16   38700.00
12   深圳  2018-03-26   34700.00
13   深圳  2018-04-02   16500.00
14   深圳  2018-04-09   41394.25
15   深圳  2018-04-16   11750.00
city              上海        北京        广州        深圳
last_date                                         
2018-03-26  36400.00  16500.00  12000.00  34700.00
2018-04-02  50514.29  62333.33  15333.33  16500.00
2018-04-09  27166.67  80000.00  16066.67  41394.25
2018-04-16  29350.00  43666.67  38700.00  11750.00

注意:数据中index的重复数量,不如上海4条,下面北京等等都要4条一致,否则报错

    avg_price = get_pd(sql_avg)
    avg_price['avg_price'] = avg_price['avg_price'].str.replace(u',', '').astype(np.float)

    avg_price_a = avg_price.pivot(index='last_date', columns='city', values='avg_price')
    avg_price_a = pd.DataFrame(avg_price_a)

    print(avg_price)
    print(avg_price_a)

#pandas的遍历
print(pdlist.ix[0])
    for i,k in pdlist.iterrows():
        print('*'*100)
        print(i)  # index值
        print('$'*10)
        print(k)  # row 值
        print('#'*10)
        print(pdlist['公司名称'][i], pdlist['关联公司'][i])

for i in company.index:
        code, name, Serial_number = company[u'证券代码'][i], company[u'证券简称'][i], company[u'证券编号'][i]


pandas 添加字段 和字典类型
table['code'] = pd.Series([sql_code for i in range(len(table.index))])




将pandas的DataFrame数据写入[MySQL](http://lib.csdn.net/base/mysql "MySQL知识库")[数据库](http://lib.csdn.net/base/mysql "MySQL知识库") + sqlalchemy

1.  import pandas as pd  
2.  from sqlalchemy import create_engine  

4.  ##将数据写入mysql的数据库,但需要先通过sqlalchemy.create_engine建立连接,且字符编码设置为utf8,否则有些latin字符不能处理  
5.  yconnect = create_engine('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')  
6.  pd.io.sql.to_sql(thedataframe,'tablename', yconnect, schema='databasename', if_exists='append')  

to_sql中,

第一个参数thedataframe是需要导入的pd dataframe,

第二个参数tablename是将导入的数据库中的表名

第三个参数yconnect是启动数据库的接口,pd 1.9以后的版本,除了sqllite,均需要通过sqlalchemy来设置

第四个参数databasename是将导入的数据库名字

第五个参数if_exists='append'的意思是,如果表tablename存在,则将数据添加到这个表的后面

sqlalchemy.create_engine是数据库引擎

('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')的解释

mysql是要用的数据库

mysqldb是需要用的接口程序  (一般用pymysql)

root是数据库账户

password是数据库密码

localhost是数据库所在服务器的地址,这里是本机

3306是mysql占用的端口

elonuse是数据库的名字

charset=utf8是设置数据库的编码方式,这样可以防止latin字符不识别而报错
conn = create_engine('mysql+pymysql://user:password@127.0.0.1:3306/db?charset=utf8')
df.to_sql('ipeorg', conn, if_exists='append', index=False)
读取:
sql = " select * from tablename '' "
df = pd.read_sql(con=engine, sql=sql)
上一篇下一篇

猜你喜欢

热点阅读