摘要:昨天晚上,筆者有幸參加了一場(chǎng)面試,有一個(gè)環(huán)節(jié)就是現(xiàn)場(chǎng)編程題目如下示例數(shù)據(jù)如下,求每名學(xué)生對(duì)應(yīng)的成績(jī)最高的那門科目與,用實(shí)現(xiàn)這個(gè)題目看上去很簡(jiǎn)單,其實(shí),并不簡(jiǎn)單。
??昨天晚上,筆者有幸參加了一場(chǎng)面試,有一個(gè)環(huán)節(jié)就是現(xiàn)場(chǎng)編程!題目如下:
??示例數(shù)據(jù)如下,求每名學(xué)生(ID)對(duì)應(yīng)的成績(jī)(score)最高的那門科目(class)與ID,用Python實(shí)現(xiàn):
這個(gè)題目看上去很簡(jiǎn)單,其實(shí),并不簡(jiǎn)單。即要求輸出形式如下:
??當(dāng)然,我們一開(kāi)始能先到的是利用Pandas中的groupby,按ID做groupby,按score取最大值,可是之后的過(guò)程就難辦了,是將得到的結(jié)果與原表做join,還是再想其他辦法?
??怎么辦?答案就是Pandas中g(shù)roupby的官方文檔說(shuō)明,網(wǎng)址為:http://pandas.pydata.org/pand...。 截圖如下:
本文將會(huì)用到其中的三個(gè)函數(shù): idxmax(), idxmin(), rank().
??其實(shí),讓我們來(lái)解決一開(kāi)始提出的問(wèn)題,Python代碼如下:
import pandas as pd df = pd.read_csv("E://score.csv") new_df = df.groupby("ID")["score"].idxmax() for i in new_df: print(df.iloc[i, :].tolist()[0:2])
分析代碼,df.groupby("ID")["score"].idxmax()是對(duì)原數(shù)據(jù)按ID做groupby,然后取score列,用idxmax()取出成績(jī)最好的行。然后取出這些行即可。
??當(dāng)然,上述代碼存在兩個(gè)衍生問(wèn)題:
每名學(xué)生(ID)對(duì)應(yīng)的成績(jī)(score)最低的那門科目(class)與ID;
若有學(xué)生他的某些科目的成績(jī)是一樣的,求每名學(xué)生對(duì)應(yīng)的成績(jī)最高的那些科目與ID。
??第一個(gè)問(wèn)題,很好解決,在原先的代碼中,將idxmax()替換為idxmin()即可,輸出的結(jié)果如下:
[1, "C"] [2, "A"] [3, "C"] [4, "A"]
??第二個(gè)問(wèn)題,如果有學(xué)生他的某些科目的成績(jī)是一樣的,如下面的示例數(shù)據(jù):
在上面數(shù)據(jù)中,第1,3名學(xué)生的最高成績(jī)存在重復(fù)。這是,我們需要用到rank()函數(shù),Python代碼如下:
import pandas as pd import numpy as np df = pd.read_csv("E://score.csv") df["rank"] = df.groupby("ID")["score"].rank(method="min", ascending=False).astype(np.int64) #print(df) print(df[df["rank"] == 1][["ID", "class"]])
輸出結(jié)果如下:
ID class 0 1 A 1 1 B 5 2 C 7 3 B 8 3 C 11 4 C
可以看到,我們得到的df這個(gè)數(shù)據(jù)框添加了一列rank,就是每名學(xué)生的科目的成績(jī)排名,得到的df如下:
ID class score rank 0 1 A 90 1 1 1 B 90 1 2 1 C 70 3 3 2 A 60 3 4 2 B 80 2 5 2 C 100 1 6 3 A 90 3 7 3 B 100 1 8 3 C 100 1 9 4 A 70 3 10 4 B 80 2 11 4 C 90 1
然后按需要取出數(shù)據(jù)即可。
??本次分享到此結(jié)束,歡迎大家交流~~
注意:本人現(xiàn)已開(kāi)通微信公眾號(hào): Python爬蟲(chóng)與算法(微信號(hào)為:easy_web_scrape), 歡迎大家關(guān)注哦~~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42637.html
?作者主頁(yè):小小明-代碼實(shí)體 ?簡(jiǎn)介:Python領(lǐng)域優(yōu)質(zhì)創(chuàng)作者?、數(shù)據(jù)處理專家? ?歡迎點(diǎn)贊 ? 收藏 ?留言 ? 昨晚有位童鞋一道Pandas面試題完全沒(méi)有思路不會(huì)做,通過(guò)黃同學(xué)找到我時(shí),這道題目離提交答案僅剩20分鐘,不過(guò)我最終還是在15分鐘之內(nèi)解決了問(wèn)題,這整個(gè)過(guò)程簡(jiǎn)直是刺激~??? 原題題目如下: 最終要求輸出: 要在20分鐘內(nèi)解決這個(gè)問(wèn)題,對(duì)于我來(lái)說(shuō)最困難的第一步就是理解...
摘要:最后使用聚合函數(shù),就得到了結(jié)果。從實(shí)現(xiàn)上看,返回的是一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu)必須調(diào)用聚合函數(shù)如之后,才會(huì)得到結(jié)構(gòu)為的數(shù)據(jù)結(jié)果。 介紹 每隔一段時(shí)間我都會(huì)去學(xué)習(xí)、回顧一下python中的新函數(shù)、新操作。這對(duì)于你后面的工作是有一定好處的。本文重點(diǎn)介紹了pandas中g(shù)roupby、Grouper和agg函數(shù)的使用。這2個(gè)函數(shù)作用類似,都是對(duì)數(shù)據(jù)集中的一類屬性進(jìn)行聚合操作,比如統(tǒng)計(jì)一個(gè)用戶在每個(gè)月...
摘要:數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑數(shù)據(jù)聚合與分組運(yùn)算數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑合并數(shù)據(jù)集可根據(jù)一個(gè)或多個(gè)鍵將不同中的行鏈接起來(lái)。函數(shù)根據(jù)樣本分位數(shù)對(duì)數(shù)據(jù)進(jìn)行面元?jiǎng)澐帧W值浠?,給出待分組軸上的值與分組名之間的對(duì)應(yīng)關(guān)系。 本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書(shū)本有出入。 在前幾篇中我們介紹了 NumPy、pandas、matplotlib 三個(gè)...
摘要:按照某一列的數(shù)值進(jìn)行排序后輸出。根據(jù)國(guó)籍這一列的屬性進(jìn)行分組,然后分別計(jì)算相同國(guó)籍的潛力的平均值。值得注意的是,在分組函數(shù)后面使用一個(gè)函數(shù)可以返回帶有分組大小的結(jié)果。 這篇文章中使用的數(shù)據(jù)集是一個(gè)足球球員各項(xiàng)技能及其身價(jià)的csv表,包含了60多個(gè)字段。數(shù)據(jù)集下載鏈接:數(shù)據(jù)集 1、DataFrame.info() 這個(gè)函數(shù)可以輸出讀入表格的一些具體信息。這對(duì)于加快數(shù)據(jù)預(yù)處理非常有幫助。 ...
閱讀 1076·2021-09-13 10:29
閱讀 3418·2019-08-29 18:31
閱讀 2665·2019-08-29 11:15
閱讀 3042·2019-08-26 13:25
閱讀 1403·2019-08-26 12:00
閱讀 2383·2019-08-26 11:41
閱讀 3472·2019-08-26 10:31
閱讀 1518·2019-08-26 10:25