前言
以下為個人理解轻庆,未必正確竹海。歡迎大家討論和指正。
操作題目
1彼绷、如何查看python已安裝的第三方庫(有兩種方法)
1.在cmd下輸入pip list回車
2.打開ANACONDA NAVIGATOR巍佑,選擇左邊的environments。之后在右邊選擇installed即可看到所有安裝的庫寄悯。(我的python是安裝anaconda的時候自帶的句狼,第一次用的時候是這個方法查看安裝了哪些庫)
2、Mysql特定版本 group by 后用 * 出錯 热某,報錯出現(xiàn) Error 1055 應(yīng)如何解決
沒遇到過,不知道怎么解決胳螟。
Mysql
1昔馋、語句效率,子查詢與連接后哪種效率更高糖耸?為什么秘遏?請寫出具體例子。(以經(jīng)典45道題為例)
連接查詢效率更高嘉竟。
因為子查詢首先要進(jìn)行一次查詢邦危,之后再以這次查詢的結(jié)果作為條件進(jìn)行查詢。這就已經(jīng)比連接方法多一次查詢了舍扰。其次倦蚪,子查詢要創(chuàng)建一個臨時表,會對性能產(chǎn)生影響边苹。
以45題中的3.查詢在 SC 表存在成績的學(xué)生信息為例
連接查詢:
select b.*
from sc a
left join student b
on a.sid = b.sid
group by b.sid;
子查詢:
select *
from student
where sid in (select sid from sc);
2陵且、left join 后的 on 條件1 and 條件2,與left join 后的 on 條件1 where 條件2个束,有什么區(qū)別慕购?
這個題目的關(guān)鍵在于兩點,第一left join會保留左表全部內(nèi)容(也就是說右邊可能會產(chǎn)生null值)茬底,第二where篩選和連接的執(zhí)行順序(先join連接沪悲,再where篩選)。
對于left join 后的 on 條件1 and 條件2阱表,因為是left join殿如,所以左表全部內(nèi)容都會顯示贡珊,右表能匹配上的內(nèi)容會匹配上并且顯示出來,匹配不上的部分會顯示null握截。這時候是單純的連接飞崖,沒有進(jìn)行where篩選,所以最后一條會有一個null值谨胞。
對于left join 后的 on 條件1 where 條件2固歪,這時候是先執(zhí)行l(wèi)eft join連接再執(zhí)行where篩選。在執(zhí)行l(wèi)eft join的時候胯努,因為只有條件1的限制而沒有where篩選的限制牢裳,右邊null值一樣會顯示。但是加上where條件2語句對前面的表進(jìn)行篩選的時候叶沛,只會保留符合where條件2的內(nèi)容蒲讯,所以這時候右邊的null值因為不符合條件2會被剔除。這時候的結(jié)果與第一種情況不同灰署,是不包含null值的判帮。
如果這個題目是inner join,那么兩種操作方式結(jié)果是一樣的溉箕,因為不存在null值晦墙。
Python
一、存在一份生成的數(shù)據(jù)
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
問題:
1肴茄、該生成的數(shù)據(jù)索引列的格式類型是什么晌畅?(直接回答)
2、有哪些方式可以查看數(shù)據(jù)類型寡痰?
3抗楔、如何查看索引的數(shù)據(jù)類型?
4拦坠、df.loc[‘2013-01-01’] 可以取出對應(yīng)第一條數(shù)據(jù)嗎连躏?
5、如果想要同時取 第一行和第三行數(shù)據(jù)贪婉,應(yīng)該如何處理反粥?
回答:
1、索引列的格式為DatetimeIndex疲迂,數(shù)據(jù)格式為datetime64才顿。
2、整體格式:type()尤蒿。內(nèi)部數(shù)據(jù)類型:.info()郑气,.dtypes。
3腰池、df.index
4尾组、可以
5忙芒、
from datetime import datetime
df.loc[[datetime.strptime('2013-01-01', '%Y-%m-%d'),datetime.strptime('2013-01-03', '%Y-%m-%d')]]
或者
df.iloc[[0,2]]
二、apply讳侨、applymap呵萨、map的區(qū)別是什么?適用場景是什么跨跨?請以上述數(shù)據(jù)搭配函數(shù)舉例試驗潮峦。
apply,applymap和map的主要區(qū)別在兩點勇婴,第一個是適用的對象忱嘹,第二個是產(chǎn)生作用的范圍。
具體說明如下:
· apply:可應(yīng)用于Series(對象)和DataFrame(對象)耕渴。應(yīng)用于Series時會對Series中的每一個元素(范圍)產(chǎn)生效果拘悦。應(yīng)用于DataFrame時,會應(yīng)用于DataFrame的每一行或者每一列(范圍)橱脸。此時础米,如果axis=0(默認(rèn)),則會把每一列(其實是一個Series)作為參數(shù)傳入apply里的函數(shù)添诉。如果椭盏,如果axis=1,則會把每一行(其實是一個Series)作為參數(shù)傳入apply里的函數(shù)吻商。
需要注意的是,返回每一個結(jié)果會組成一個Series糟红,要特別注意這個Series的索引艾帐。如果是axis=0,即按列傳入盆偿,返回的Series會是原本Dataframe的列名柒爸。如果axis=1,即按行傳入事扭,返回的Series會是原本Dataframe的行標(biāo)簽捎稚。
· map:應(yīng)用在單獨一個Series(對象)的每個元素中(范圍)
· applymap:應(yīng)用在DataFrame(對象)的每個元素中(范圍)
以下為搭配函數(shù)舉例:
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
Apply應(yīng)用于Series:
用于單獨一行的情況(單獨一行為Series對象)
df.loc['2013-01-01'].apply(lambda x:x+1)
用于單獨一列的情況(單獨一列也為Series對象)
df.A.apply(lambda x:x+1)
Apply應(yīng)用于DataFrame:
df.apply(max)
df.apply(lambda x:x+1)
Map用于Series:
df.loc['2013-01-01'].map(lambda x:x+1)
df.A.map(lambda x:x+1)
Applymap用于DataFrame:
df.applymap(lambda x:x+1)
通過以上分析,代碼及運(yùn)行結(jié)果求橄,有以下結(jié)論:
1.首先明確一個觀點今野,DataFrame中的單獨一行或者單獨一列是一個Series。
2.因此罐农,在Apply應(yīng)用于DataFrame單獨一行或者單獨一列時骤星,其實是應(yīng)用于一個Series黄锤。此時,Apply和Map的效果是一樣的茂浮。df.loc['2013-01-01'].apply(lambda x:x+1)
和df.loc['2013-01-01'].map(lambda x:x+1)
運(yùn)行結(jié)果相同。df.A.apply(lambda x:x+1)
和df.A.map(lambda x:x+1)
運(yùn)行結(jié)果也相同鹏倘。
3.但是如果Apply是直接對應(yīng)整個DataFrame發(fā)生作用,即對每一行或者每一列發(fā)生作用,那么結(jié)果與map不同旋圆。df.apply(lambda x:x+1)
與df.A.map(lambda x:x+1)
不同。
4.Apply作用于整個DataFrame時麸恍,有些情況下結(jié)果與Applymap相同灵巧,需要視具體傳遞的函數(shù)決定。df.apply(lambda x:x+1)
與df.applymap(lambda x:x+1)
結(jié)果相同或南,因為前者對每一列的每一個元素+1孩等,后者是對全部元素+1,從結(jié)果來看是等價的采够。但是df.apply(max)
是特殊的肄方,它針對DataFrame的每一列返回每一列的最大值,這個是Applymap不具備的蹬癌。