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)