Pandas基本操作以及SQL對照

介紹

CREATE TABLE "candidates" (
    "id" INTEGER PRIMARY KEY  NOT NULL ,
    "first_name" VARCHAR,
    "last_name" VARCHAR,
    "middle_name" VARCHAR,
    "party" VARCHAR NOT NULL
);
CREATE TABLE "contributors" (
    "id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,
    "last_name" VARCHAR,
    "first_name" VARCHAR,
    "middle_name" VARCHAR,
    "street_1" VARCHAR,
    "street_2" VARCHAR,
    "city" VARCHAR,
    "state" VARCHAR,
    "zip" VARCHAR,
    "amount" INTEGER,
    "date" DATETIME,
    "candidate_id" INTEGER NOT NULL, name,
    FOREIGN KEY(candidate_id) REFERENCES candidates(id)
);

dfcond對應(yīng)的是contributors表佃声,dfuser對應(yīng)的是condidates

數(shù)據(jù)查詢

  • 單條件
    查找first_name為‘John’的數(shù)據(jù)
dfcond.query("first_name=='John'")
dfcond[dfcond.first_name=='John']
dfcond.loc[dfcond.first_name=='John']
上面三個語句等價
###SQL
select  * from contributors where first_name == 'John'
  • 多條件
    查找last_name為Ahrens,訂單大于500的數(shù)據(jù)
dfcond.query("last_name=='Ahrens' and amount>500")
###SQL
select * from contributors where last_name=='Ahrens' and amount>500
  • 空值
    查找state為空的數(shù)據(jù)
dfcond[dfcond.state.isnull()]
###SQL
select * from contributors where state is null
  • 多值選擇
    查找state為VA或者WA的數(shù)據(jù)
dfcond[dfcond.state.isin(['VA','WA'])]
###SQL
select * from contributors where state in ('VA','WA')
  • 區(qū)間查找
    查到訂單介于10到50之間的數(shù)據(jù)
dfcond.query("10<=amount<=50")
###SQL
select * from contributors where amount between 10 and 50
  • 重復(fù)值
    查找first_name,last_name
dfcond[['first_name,last_name']].drop_duplicates()
dfcond.drop_duplicates(subset=['first_name,last_name'],keep='first')
keep還可以選擇'last'囤萤,或者False刪除所有重復(fù)項
###SQL
select distinct first_name,last_name from contributors
  • 數(shù)據(jù)返回量控制
    返回三條記錄
dfcond[0:3]
dfcond.iloc[0:3]
#SQL
select * from contributors limit 3
  • 帶有函數(shù)的例子
    訂單值大于最大訂單值減去2000
dfcond[dfcond.amount>dfcond.amount.max()-2000]
###SQL
select * from contributors where amount>(select max(amount) from contributors)
  • 聯(lián)合查找
    從candidates表中查找last_name為Obama耗溜,然后去contributors中查找與其有關(guān)的記錄坐桩。
cid = dfuser.query("last_name=='Obama'")['id'].values[0]
dfcond.query('candidate_id=={}'.format(cid))
###SQL
select * from contributors where candidate_id =
 (select id from candidates where last_name='Obama')
#也可以進行隱式連接
select contributors.last_name,contributors.amount from contributors,candidates where 
condidates.last_name='Obama' and condidates.id = contributors.candidate_id
  • 內(nèi)聯(lián)
dfcond.merge(dfuser,left_on='candidate_id',right_on='id')
###SQL
select * from contributors,candidates where contributors.candidate_id =
candidates.id
select * from contributors inter join candidates on candidate_id=candidates.id
#這里有個疑問就是candidate_id如果加了表名字段就會報錯钝的,找不到字段
  • 左聯(lián)/右聯(lián)/全聯(lián)
dfcond.merge(dfuser,left_on='candidate_id',right_on='id',how='left/right/outer')
###SQL
select * from contributors left join candidates on candidate_id=candidates.id
select * from contributors right join candidates on candidate_id=candidates.id
select * from contributors full join candidates on candidate_id=candidates.id

left,right,full的區(qū)別惧辈?

行列操作

  • 列選擇
    選擇first_name列
dfcond['first_name']
dfcond[['first_name','last_name']]#多列選擇
###SQL
select first_name from contributors
select first_name,last_name from contributors
  • 新增加一列
    增加一列name
dfcond['name'] = dfcond['last_name']+','+dfcond['first_name']
dfcond.assign(name=dfcond.last_name+":"+dfcond.first_name)
###對于sql要修改數(shù)據(jù)表
ALTER TABLE contributors ADD COLUMN name varchar(255);
  • 列刪除
    刪除name列
del dfcond['name']
###SQL
alter table contributors drop column name
  • 行刪除
    刪除所有l(wèi)ast_name為Ahrens的行
#這里其實比較復(fù)雜琳状,先把last_name弄成索引,然后刪除盒齿,最后恢復(fù)索引
df2=dfcwdi.copy()
df2.set_index('last_name', inplace=True)
df2.drop(['Ahrens','Akin'],inplace=True)#這里可以單個也可以多個值
df2.reset_index()
# 其實這里沒必要這樣直接就是查詢last_name 不等于Ahrens的行就可以了
ndf = dfcwdi.query('last_name!="Ahrens"')
###SQL
delete from contributors where last_name='Ahrens'
delete from contributes where last_name in ('Ahrens','Akin')

數(shù)據(jù)修改

  • 多行數(shù)據(jù)修改
dfcond.loc[dfcond.state=='VA','name'] = "Junk"
###SQL
update contributors set name = "Junk" where state = 'VA'

聚合Aggregate

  • 極值
###amount最大值
dfcond.describe()###獲取平均值念逞,極值(貌似只對數(shù)據(jù)有效)
dfcond.amount.max()
dfcond[dfcond.amount.max()==dfcond.amount]
###SQL
select *,max(amount) as maxcol from contributors
  • 計數(shù)
dfcond.count()
#返回所有字段的統(tǒng)計計數(shù),空值不算
dfcond.info()#這個函數(shù)也有同樣的結(jié)果
dfcond.XX.count_values()#對相同的值進行統(tǒng)計边翁,類似于Counter功能
###SQL
select count(amount) as countcol from contributors
#平均值
select avg(amount) as avgcol from contributors
  • groupby
    根據(jù)state分類匯總
dfcond.groupby('state').sum()#分類匯總求和
gb = dfcond.groupby('state')#分組
CA = gb.get_group('CA')#獲取單個分組
###SQL
SELECT state,SUM(amount) FROM contributors GROUP BY state

排序

df = dfcond.sort_values(by=['last_name'],ascending=False)#采用降序排列
###SQL
SELECT * FROM contributors ORDER BY last_name DESC;

pandas與數(shù)據(jù)庫之間的轉(zhuǎn)換

from sqlite3 import dbapi2 as sq3
import os
PATHSTART="."
def get_db(dbfile):
    sqlite_db = sq3.connect(os.path.join(PATHSTART, dbfile))
    return sqlite_db
def init_db(dbfile, schema):
    """Creates the database tables."""
    db = get_db(dbfile)
    db.cursor().executescript(schema)
    db.commit()
    return db
db=init_db("cancont.db", ourschema)
dfusers.to_sql("candidates", db, if_exists="append", index=False)
dfcand.to_sql("contributors", db, if_exists="append", index=False)

另一種數(shù)據(jù)插入方法

ins="""
INSERT INTO candidates (id, first_name, last_name, middle_name, party) \
    VALUES (?,?,?,?,?);
"""
#candidates.txt文件中第一行是表頭
with open('./candidates.txt') as f:
    lines = f.readlines()
    for line in lines[1:]:
        zid,first_name,last_name,middle_name,party = line.strip().split('|')
        print(zid,first_name,last_name,middle_name,party)
        vals = (int(zid),first_name,last_name,middle_name,party)
        print(vals)
        db.cursor().execute(ins,vals)

sql語句執(zhí)行函數(shù)

def make_query(sql):
    c = db.cursor().execute(sql)
    return c.fetchall()

把查詢結(jié)果轉(zhuǎn)換為dataframe對象

def make_frame(data,col_names):
    frame = []
    for i,name in enumerate(col_names):
        frame.append((name,[d[i] for d in data]))
    #把行編程列
    return pd.DataFrame.from_items(frame)

上面的函數(shù)需要列名

col_names = [field[1] for field in make_query("pragma table_info(contributors)")]
#這是針對sqlite

使用例子

make_frame(make_query("select * from contributors where state is null"),col_names)

如果是sqlite數(shù)據(jù)庫翎承,可以直接如下讀取

pd.read_sql("SELECT * FROM candidates WHERE party= 'D';", db)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市符匾,隨后出現(xiàn)的幾起案子叨咖,更是在濱河造成了極大的恐慌,老刑警劉巖啊胶,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甸各,死亡現(xiàn)場離奇詭異,居然都是意外死亡焰坪,警方通過查閱死者的電腦和手機趣倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來某饰,“玉大人儒恋,你說我怎么就攤上這事善绎。” “怎么了诫尽?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵禀酱,是天一觀的道長。 經(jīng)常有香客問我箱锐,道長比勉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任驹止,我火速辦了婚禮浩聋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臊恋。我一直安慰自己衣洁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布抖仅。 她就那樣靜靜地躺著坊夫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撤卢。 梳的紋絲不亂的頭發(fā)上环凿,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音放吩,去河邊找鬼智听。 笑死,一個胖子當(dāng)著我的面吹牛渡紫,可吹牛的內(nèi)容都是我干的到推。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼惕澎,長吁一口氣:“原來是場噩夢啊……” “哼莉测!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唧喉,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤捣卤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欣喧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌零,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年唆阿,在試婚紗的時候發(fā)現(xiàn)自己被綠了益涧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡驯鳖,死狀恐怖闲询,靈堂內(nèi)的尸體忽然破棺而出久免,到底是詐尸還是另有隱情,我是刑警寧澤扭弧,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布阎姥,位于F島的核電站,受9級特大地震影響鸽捻,放射性物質(zhì)發(fā)生泄漏呼巴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧画拾,春花似錦、人聲如沸府瞄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遵馆。三九已至,卻和暖如春丰榴,著一層夾襖步出監(jiān)牢的瞬間货邓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工四濒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逻恐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓峻黍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拨匆。 傳聞我的和親對象是個殘疾皇子姆涩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 小麥這幾天有個特別的新情況 就是好基友已經(jīng)有了心怡的女孩[驚恐] 這才不到十歲誒[囧]小哥嘻嘻索索的嘮叨著他這個好...
    Snowy_125閱讀 515評論 0 0
  • 2017年已經(jīng)悄悄地過了一半,這半年里養(yǎng)成了一些好的習(xí)慣惭每,每次想起來就有點小自豪骨饿,每天有幾件必須要做的事情,不但不...
    snailwww閱讀 208評論 2 2
  • 昨晚有一股清風(fēng) 我不知道它為什么遠離 昨晚有一個人 我不知道他為何在窗外站了許久許久 昨晚 隔壁 發(fā)生了一場戰(zhàn)爭 ...
    為你點一杯陽春面閱讀 106評論 0 1