针对上一节的练习问题,以下为参考代码。
首先将数据表完整的在Python中表示出来。
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
data={'Chinese':[66,95,95,90,80,80],'English':[65,85,92,88,90,90],'Math':[None,98,96,77,90,90]}
df=pd.DataFrame(data,index=['ZhangFei','GuanYu','ZhaoYun','HuangZhong','DianWei','DianWei'],columns=['Chinese','English','Math'])
print(df)
运行结果:
Chinese English Math
ZhangFei 66 65 NaN
GuanYu 95 85 98.0
ZhaoYu 95 92 96.0
HuangZhong 90 88 77.0
DianWei 80 90 90.0
DianWei 80 90 90.0
接下来,我们看到DianWei
行重复了,因此去重复的行,以及将各科名称重命名为中文。
#去重复行
df=df.drop_duplicates()
#列名重命名
df.rename(columns={'Chinese':'语文','English':'英语','Math':'数学'},inplace=True)
print(df)
运行结果:
语文 英语 数学
ZhangFei 66 65 NaN
GuanYu 95 85 98.0
ZhaoYu 95 92 96.0
HuangZhong 90 88 77.0
DianWei 80 90 90.0
通过上述操作,我们看到重复的DianWei
行只保留了一行,且各科目名称被改成了中文。接下来要进行数据统计,在数据统计之前,判断是否有缺失值,若存在缺失值,考虑对缺失值进行处理。
print(df.isnull().sum())#判断缺失值
print(df.isnull())#查找缺失值
运行结果:
语文 0
英语 0
数学 1
dtype: int64
语文 英语 数学
ZhangFei False False True
GuanYu False False False
ZhaoYu False False False
HuangZhong False False False
DianWei False False False
从代码结果中看出数学列中有1个缺失值,具体位置是ZhangFei
的数学成绩缺失。考虑用数学成绩的平均值进行填充。
df['数学'].fillna(df['数学'].mean(),inplace=True)#用均值填充缺失值
print(df)
运行结果:
语文 英语 数学
ZhangFei 66 65 90.25
GuanYu 95 85 98.00
ZhaoYu 95 92 96.00
HuangZhong 90 88 77.00
DianWei 80 90 90.00
从结果可以看到ZhangFei
的数学成绩已经填充好了。下面添加总分
一列,并依据总分从高到低排序。
def total_score(df):
df[u'总分']=df[u'语文']+df[u'英语']+df[u'数学']
return df
df=df.apply(total_score,axis=1)
print(df)
df.sort_values(['总分'],ascending=False,inplace=True)#按总分从高到低排序
print(df)
运行结果:
语文 英语 数学 总分
ZhangFei 66.0 65.0 90.25 221.25
GuanYu 95.0 85.0 98.00 278.00
ZhaoYu 95.0 92.0 96.00 283.00
HuangZhong 90.0 88.0 77.00 255.00
DianWei 80.0 90.0 90.00 260.00
语文 英语 数学 总分
ZhaoYu 95.0 92.0 96.00 283.00
GuanYu 95.0 85.0 98.00 278.00
DianWei 80.0 90.0 90.00 260.00
HuangZhong 90.0 88.0 77.00 255.00
ZhangFei 66.0 65.0 90.25 221.25
从结果中看出ZhaoYun
的总分最高。其实,在计算总分时还有一个更简便的方法。
df[u'总分']=df.sum(axis=1)
print(df)
运行结果:
语文 英语 数学 总分
ZhangFei 66 65 90.25 221.25
GuanYu 95 85 98.00 278.00
ZhaoYun 95 92 96.00 283.00
HuangZhong 90 88 77.00 255.00
DianWei 80 90 90.00 260.00
结果和上面应用apply()函数的结果一致,但代码更简洁。下面对数据进行统计。
print(df.describe())
运行结果:
语文 英语 数学 总分
count 5.000000 5.000000 5.000000 5.000000
mean 85.200000 84.000000 90.250000 259.450000
std 12.357184 10.931606 8.196798 24.382627
min 66.000000 65.000000 77.000000 221.250000
25% 80.000000 85.000000 90.000000 255.000000
50% 90.000000 88.000000 90.250000 260.000000
75% 95.000000 90.000000 96.000000 278.000000
max 95.000000 92.000000 98.000000 283.000000
好了,练习的代码到这里就基本结束了,关于Pandas的学习还远远没有结束。希望我们在以后的学习里多多动手实操,多多发现,多多进步。
最后的最后,当然是宣传我的个人公众号啦:小菜鸡的技术之路。欢迎大家一起交流,一起进步啊!附上我的公众号二维码。