前言
以下為個(gè)人理解,未必正確。歡迎大家討論和指正。
操作題目
1、如何查看python已安裝的第三方庫(kù)(有兩種方法)
1.在cmd下輸入pip list回車
2.打開ANACONDA NAVIGATOR,選擇左邊的environments。之后在右邊選擇installed即可看到所有安裝的庫(kù)。(我的python是安裝anaconda的時(shí)候自帶的,第一次用的時(shí)候是這個(gè)方法查看安裝了哪些庫(kù))
2、Mysql特定版本 group by 后用 * 出錯(cuò) ,報(bào)錯(cuò)出現(xiàn) Error 1055 應(yīng)如何解決
沒遇到過,不知道怎么解決。
Mysql
1、語句效率,子查詢與連接后哪種效率更高?為什么?請(qǐng)寫出具體例子。(以經(jīng)典45道題為例)
連接查詢效率更高。
因?yàn)樽硬樵兪紫纫M(jìn)行一次查詢,之后再以這次查詢的結(jié)果作為條件進(jìn)行查詢。這就已經(jīng)比連接方法多一次查詢了。其次,子查詢要?jiǎng)?chuàng)建一個(gè)臨時(shí)表,會(huì)對(duì)性能產(chǎn)生影響。
以45題中的3.查詢?cè)?SC 表存在成績(jī)的學(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ū)別?
這個(gè)題目的關(guān)鍵在于兩點(diǎn),第一left join會(huì)保留左表全部?jī)?nèi)容(也就是說右邊可能會(huì)產(chǎn)生null值),第二where篩選和連接的執(zhí)行順序(先join連接,再where篩選)。
對(duì)于left join 后的 on 條件1 and 條件2,因?yàn)槭莑eft join,所以左表全部?jī)?nèi)容都會(huì)顯示,右表能匹配上的內(nèi)容會(huì)匹配上并且顯示出來,匹配不上的部分會(huì)顯示null。這時(shí)候是單純的連接,沒有進(jìn)行where篩選,所以最后一條會(huì)有一個(gè)null值。
對(duì)于left join 后的 on 條件1 where 條件2,這時(shí)候是先執(zhí)行l(wèi)eft join連接再執(zhí)行where篩選。在執(zhí)行l(wèi)eft join的時(shí)候,因?yàn)橹挥袟l件1的限制而沒有where篩選的限制,右邊null值一樣會(huì)顯示。但是加上where條件2語句對(duì)前面的表進(jìn)行篩選的時(shí)候,只會(huì)保留符合where條件2的內(nèi)容,所以這時(shí)候右邊的null值因?yàn)椴环蠗l件2會(huì)被剔除。這時(shí)候的結(jié)果與第一種情況不同,是不包含null值的。
如果這個(gè)題目是inner join,那么兩種操作方式結(jié)果是一樣的,因?yàn)椴淮嬖趎ull值。
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’] 可以取出對(duì)應(yīng)第一條數(shù)據(jù)嗎?
5、如果想要同時(shí)取 第一行和第三行數(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ū)別是什么?適用場(chǎng)景是什么?請(qǐng)以上述數(shù)據(jù)搭配函數(shù)舉例試驗(yàn)。
apply,applymap和map的主要區(qū)別在兩點(diǎn),第一個(gè)是適用的對(duì)象,第二個(gè)是產(chǎn)生作用的范圍。
具體說明如下:
· apply:可應(yīng)用于Series(對(duì)象)和DataFrame(對(duì)象)。應(yīng)用于Series時(shí)會(huì)對(duì)Series中的每一個(gè)元素(范圍)產(chǎn)生效果。應(yīng)用于DataFrame時(shí),會(huì)應(yīng)用于DataFrame的每一行或者每一列(范圍)。此時(shí),如果axis=0(默認(rèn)),則會(huì)把每一列(其實(shí)是一個(gè)Series)作為參數(shù)傳入apply里的函數(shù)。如果,如果axis=1,則會(huì)把每一行(其實(shí)是一個(gè)Series)作為參數(shù)傳入apply里的函數(shù)。
需要注意的是,返回每一個(gè)結(jié)果會(huì)組成一個(gè)Series,要特別注意這個(gè)Series的索引。如果是axis=0,即按列傳入,返回的Series會(huì)是原本Dataframe的列名。如果axis=1,即按行傳入,返回的Series會(huì)是原本Dataframe的行標(biāo)簽。
· map:應(yīng)用在單獨(dú)一個(gè)Series(對(duì)象)的每個(gè)元素中(范圍)
· applymap:應(yīng)用在DataFrame(對(duì)象)的每個(gè)元素中(范圍)
以下為搭配函數(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:
用于單獨(dú)一行的情況(單獨(dú)一行為Series對(duì)象)
df.loc['2013-01-01'].apply(lambda x:x+1)

用于單獨(dú)一列的情況(單獨(dú)一列也為Series對(duì)象)
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.首先明確一個(gè)觀點(diǎn),DataFrame中的單獨(dú)一行或者單獨(dú)一列是一個(gè)Series。
2.因此,在Apply應(yīng)用于DataFrame單獨(dú)一行或者單獨(dú)一列時(shí),其實(shí)是應(yīng)用于一個(gè)Series。此時(shí),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是直接對(duì)應(yīng)整個(gè)DataFrame發(fā)生作用,即對(duì)每一行或者每一列發(fā)生作用,那么結(jié)果與map不同。df.apply(lambda x:x+1)與df.A.map(lambda x:x+1)不同。
4.Apply作用于整個(gè)DataFrame時(shí),有些情況下結(jié)果與Applymap相同,需要視具體傳遞的函數(shù)決定。df.apply(lambda x:x+1)與df.applymap(lambda x:x+1)結(jié)果相同,因?yàn)榍罢邔?duì)每一列的每一個(gè)元素+1,后者是對(duì)全部元素+1,從結(jié)果來看是等價(jià)的。但是df.apply(max)是特殊的,它針對(duì)DataFrame的每一列返回每一列的最大值,這個(gè)是Applymap不具備的。