题目来自牛客网,本文仅是个人学习笔记
查看数据
1、用pandas查看用户数据
现有一个Nowcoder.csv文件,它记录了部分用户数据,包含如下字段(字段与字段之间以逗号间隔)
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Nowcoder.head(6))
pandas是python的一个数据库,在使用数据库的时候需要输入 import pandas as pd 引入,
df = pd.read.csv(''文件路径“):这是利用pandas数据库读取CSV文件的方法,如果读取EXCEL文件或者其他文件,csv文件换成其他文件的格式。
df.dtypes:如果在文件中有字符型数据返回object
df.head(n):表示将前n行数据显示出来,默认是显示前五行
df.tail(n):表示将后n行数据显示出来,默认后五行
最后打印即可
打开文件时需要添加dtype=object,防止年份信息读取为小数。
2、查看数据集的大小
现有一个Nowcoder.csv文件,它记录了部分用户数据,包含如下字段(字段与字段之间以逗号间隔)
你不需要输出全部数据,请直接告诉我们这个数据集的大小,即行数与列数。
import pandas as pd
df = pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(df.shape)
3、查看第10位用户信息
现有一个Nowcoder.csv文件,它记录了部分用户数据,包含如下字段(字段与字段之间以逗号间隔)
查看这个数据集中第10行的用户的全部信息
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Nowcoder.loc[10,:])
分清楚iloc和loc的区别,前者通过行号定位,后者通过索引定位
iloc[行索引,列索引] (不接受列字段名称作为参数,只支持列字段的位置索引作为参数)
loc[行索引,列名/column] (接受具体名称)
4、查看第10行到第20行特定列数据
现有一个Nowcoder.csv文件,它记录了部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
查看这个数据集中第10行到第20行的用户的常用语言分别是什么,请你帮他输出一下。
import pandas as pd
Nowcoder = pd.read_csv("Nowcoder.csv", sep=",", dtype=object)
print(Nowcoder.loc[10:20, "Language"])
# print(Nowcoder.iloc[10:20,5])
loc : Selection by Label ,按标签取数据,
loc[行索引,列名/column]
(如果第二个参数的个数是全部即 : ,可以省略不写)。
例:
print(df.loc[1,‘name’]) # 索引1(行),名为‘name’的列
iloc : Selection by Position,即按位置选择. 只接受整型参数。
不接受列字段名称作为参数,只支持列字段的位置索引作为参数。
iloc[行索引,列索引] (没有逗号及以后就是默认列为所有列)
例:
print(df.iloc[1,0]) # 第2行第1列的值
数据索引
5、判断文件列数据是否完整
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔
想知道这份数据是不是所有列的信息都是有数据的,有没有哪些列的数据没有补全,请输出每列信息是否有为空值。
import pandas as pd
Nowcoder = pd.read_csv("Nowcoder.csv", sep=",", dtype=object)
print(Nowcoder.isnull().any(axis=0))
- isnull: 判断是否为空。
返回bool类型的值:True or False- any:返回是否至少一个元素为真
all:返回是否所有元素为真
axis=1或0: 1表示横轴,方向从左到右;0表示纵轴,方向从上到下
6、查看特定数据的信息
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
想知道哪些人经常使用Python这门语言,并且他们的其他信息是怎么样的
输出该数据集中语言为Python对应的所有列的信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv("Nowcoder.csv", sep=",", dtype=object)
print(Nowcoder[Nowcoder["Language"] == "Python"])
7、查看特定数据的信息
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
想知道牛客网的Python用户的成就值都有多高,请问该如何输出?
输出该数据集中语言为Python对应的成就值这一列的信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(Nowcoder[Nowcoder['Language']=='Python']['Achievement_value'])
8、特定N行的特定数值
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
输出该文件最后5行用户的用户ID、等级、成就值、常用语言等数据,包括行号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv', sep=',')
# print(Nowcoder.iloc[-5:,[0,1,2,5]])
# print(Nowcoder.loc[-5:,['Nowcoder_ID','Level','Achievement_value','Language']])
print(Nowcoder[['Nowcoder_ID','Level','Achievement_value','Language']].tail(5))
逻辑运算
9、多个特定条件的信息
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
输出该数据集中语言为Java且毕业年份为2020的对应的所有列的信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 显示所有行
pd.set_option('display.max_columns', None) # 显示所有列
print(Nowcoder.loc[(Nowcoder['Language']=='Java')&(Nowcoder['Graduate_year']==2020),:])
9、多个特定属性的信息
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
输出该数据集中 语言为CPP、C、C# 对应的所有列的信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option('display.width',300)
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None)
print(Nowcoder.loc[(Nowcoder['Language']=='C')|(Nowcoder['Language']=='CPP')|(Nowcoder['Language']=='C#'),:])
# print(Nowcoder[Nowcoder['Language'].isin (['CPP','C','C#'])])
# print(Nowcoder.query("Language == 'CPP' or Language == 'C' or Language == 'C#'"))
# print(Nowcoder.query("Language in ['CPP','C','C#']"))
# print(Nowcoder.loc[Nowcoder.Language.isin(["CPP", "C", "C#"])])
10、特定范围内的特定值
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
输出该数据集中刷题量不低于500对应的等级与成就值这一列的信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 显示所有行
pd.set_option('display.max_columns', None) # 显示所有列
# print(Nowcoder.loc[Nowcoder['Num_of_exercise']>=500,['Level', 'Achievement_value']])
print(Nowcoder[Nowcoder.Num_of_exercise>=500][['Level', 'Achievement_value']])
不能使用.iloc,好像是因为.iloc基于bool
11、特定筛选条件的全部信息
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
输出该数据集中使用CPP的7级用户,且他们的毕业年份不是2018的的全部信息,包括列号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 显示所有行
pd.set_option('display.max_columns', None) # 显示所有列
print(Nowcoder.query('Language == "CPP" & Level >= 7 & Graduate_year != 2018'))
中级函数
12、计算某一特征的数量
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
输出该数据集中常用语言所在列各种不同语言出现的次数。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(Nowcoder['Language'].value_counts())
value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
参数:
- 1.normalize : boolean, default False 默认false,如为true,则以百分比的形式显示
- 2.sort : boolean, default True 默认为true,会对结果进行排序
- 3.ascending : boolean, default False 默认降序排序
- 4.bins : integer, 格式(bins=1),意义不是执行计算,而是把它们分成半开放的数据集合,只适用于数字数据
- 5.dropna : boolean, default True 默认删除na值
13、牛客网用户最近的最长与最短连续签到天数
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交题目数量
Last_submission_time:最后一次提交题目日期
直接输出最长与最短签到天数的两个数字,数字之间换行。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(Nowcoder['Continuous_check_in_days'].max())
print(Nowcoder['Continuous_check_in_days'].min())
14、Python用户的平均提交次数
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
直接输出Python用户提交代码次数的平均数,直接输出,保留一位小数。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(round(Nowcoder[Nowcoder['Language']=='Python']['Number_of_submissions'].mean(),1))
15、牛客网用户等级的中位数
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
统计刷题数量不低于10题的用户的用户等级的中位数,输出类型为整型Int。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(int(Nowcoder[Nowcoder['Num_of_exercise']>=10]['Level'].median()))
16、用户常用语言有多少
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
直接输出常用语言的种类数,输出类型为整型Int。
换行再输出有哪些语言,排序按照在csv中的出现顺序排布。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv', sep=',')
print(len(Nowcoder.Language.unique()))
print(list(Nowcoder.Language.unique()))
17、牛客网最多的用户等级(众数)
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
输出等级列的众数。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(Nowcoder.loc[:,['Level']].mode())
18、用分位数分析牛客网用户活动
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
现要分析牛客网用户的活跃情况,请依次输出用户成就值与最近连续签到天数的四分之一分位数以及刷题量与代码提交次数的四分之三分位数。
按照上述要求输出分位数,两种之间换行。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
print(Nowcoder[['Achievement_value','Continuous_check_in_days']].quantile(0.25))
print(Nowcoder[['Num_of_exercise','Number_of_submissions']].quantile(0.75))
19、牛客网大佬之间的差距
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
输出7级用户中最高成就值与最低成就值之差。直接输出计算结果,为整数。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
seven = Nowcoder[Nowcoder['Level']==7]['Achievement_value']
print(int(max(seven)-min(seven))) #方法一:求出最大值最小值后作差
# print(seven.values.ptp()) #方法二:numpy.ptp()是计算最大值与最小值差的函数
20、牛客用户刷题量的方差与提交次数的标准差
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
计算用户刷题量的方差以及提交代码次数的标准差,直接输出计算的结果,各自保留两位小数,第一行为方差,第二行为标准差。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv')
print(round(Nowcoder.Num_of_exercise.var(),2)) #方差是var
print(round(Nowcoder.Number_of_submissions.std(),2)) #标准差是std
21、大佬用户成就值比例
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
第一列输出行号,第二列输出计算7级用户的成就值占所有人成就值总和的比例,以小数形式输出,小数位保留不用管。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv')
seven = Nowcoder[Nowcoder['Level']==7]['Achievement_value']
total = Nowcoder['Achievement_value'].sum()
print(seven/total)
22、牛客网用户最高的正确率
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
只统计刷题数量大于10题的用户,直接输出计算的正确率(刷题量/代码提交次数),保留3位小数。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv')
ten = Nowcoder['Num_of_exercise']>10
print(round(max(Nowcoder[ten]['Num_of_exercise']/Nowcoder[ten]['Number_of_submissions']),3))
23、统计牛客网用户的名字长度
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
输出每一行用户名字的长度,包括行号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv')
print(Nowcoder.Name.str.len()) #方法一
# print(Nowcoder.Name.apply(len)) #方法二:使用apply
数据清洗
24、去掉信息不全的用户
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
去掉有缺失数据的行,直接输出清洗后的全部数据。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',',dtype=object) #去掉小数
pd.set_option('display.width',300)
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None) #格式设定
print(Nowcoder.dropna()) #去掉无效值
25、修补缺失的用户数据
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
用户文件出现了部分缺失的值,请使用当前的最大年份填充缺失的毕业年份(“Graduate_year”),用Python填充缺失的常用语言(“Language”),用成就值的均值(四舍五入保留整数)填充缺失的成就值(“Achievement_value”)。
输出修改后的全部数据,不用处理输出时年份与成就值的小数点问题。
pandas中的 fillna使用(pandas.DataFrame.fillna)
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv')
pd.set_option('display.width',300)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
max_year = Nowcoder.Graduate_year.max()
max_mean = Nowcoder.Achievement_value.mean()
# fillna接受字典形式传参,key是列名,value是想填充的值。
values = {
"Graduate_year":max_year,
"Language":"Python",
"Achievement_value":max_mean
}
# inplace=False 的情况(默认),此时Nowcoder的值没有变化,new_table存储新值
new_table = Nowcoder.fillna(value=values)
print(new_table)
# inplace=True 的情况,此时Nowcoder的值已经变化
# new_table = Nowcoder.fillna(value=values,inplace=True)
# print(Nowcoder)
不用字典传参:
import pandas as pd
Nowcoder = pd.read_csv("Nowcoder.csv", sep=",")
pd.set_option("display.width", 300) # 设置字符显示宽度
pd.set_option("display.max_rows", None) # 设置显示最大行
pd.set_option("display.max_columns", None)
a = Nowcoder["Graduate_year"].max()
Nowcoder['Graduate_year']=Nowcoder['Graduate_year'].fillna(value=a)
Nowcoder['Language']=Nowcoder['Language'].fillna('Python')
Nowcoder['Achievement_value']=Nowcoder['Achievement_value'].fillna(round(Nowcoder['Achievement_value'].mean(),0))
print(Nowcoder)
26、解决牛客网用户重复的数据
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
系统错误将很多相同用户的数据输出了多条,导致文件中有很多重复的行,请先检查每一行是否重复,然后输出删除重复行后的全部数据。
先输出每一行是否重复,再输出去重后的文件全部数据。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option("display.width", 300)
pd.set_option("display.max_rows", None)
pd.set_option("display.max_columns", None)
print(Nowcoder.duplicated())
print(Nowcoder.drop_duplicates())
27、统一最后刷题日期的格式
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
最后一次提交题目日期这一列有各种各样的日期格式。
输出用户ID、等级以及统一后的日期(日期格式统一为yyyy-mm-dd)三列,包括行号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
Nowcoder['Last_submission_time'] = pd.to_datetime(Nowcoder['Last_submission_time'],format='%Y-%m-%d')
print(Nowcoder[['Nowcoder_ID','Level','Last_submission_time']])
Json处理
28、将用户的json文件转换为表格形式
现有一个Nowcoder.json文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Graduate_year:毕业年份
Language:常用语言
输出转换为DataFrame的全部数据,包括行号。
import pandas as pd
data = pd.read_json("Nowcoder.json", dtype=dict)
pd.set_option("display.width", 300)
pd.set_option("display.max_rows", None)
pd.set_option("display.max_columns", None)
print(data)
import pandas as pd
import json
pd.set_option('display.width', 300)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
with open('Nowcoder.json', 'r') as f: #只读模式打开文件
data = json.loads(f.read()) #加载读取信息赋值给变量
print(pd.DataFrame(data)) #信息转化为数据框
分组聚合
29、牛客网的每日练题量
现有牛客网12月每天练习题目情况的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
请你统计2021年12月每天练习题目的数量。
import pandas as pd
Nowcoder = pd.read_csv('nowcoder.csv',sep=',')
Nowcoder['date'] = pd.to_datetime(Nowcoder['date'],format='%Y-%m-%d') #日期转换
Nowcoder = Nowcoder[(Nowcoder['date'].dt.year==2021)&(Nowcoder['date'].dt.month==12)] #筛选2021年12月数据
print(Nowcoder['user_id'].groupby(Nowcoder['date']).count())
30、牛客网用户练习的平均次日留存率
现有牛客网12月每天练习题目情况的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
现需要查看用户在某天练习后第二天还会再来练习的留存情况,请计算用户练习的平均次日留存率。
以上数据集中某天练习后第二天还会再来的用户数除以user_id总次数(不考虑重复情况)记为平均此日留存率,结果保留两位小数。
import pandas as pd
from datetime import timedelta
Nowcoder = pd.read_csv('nowcoder.csv',sep=',')
Nowcoder['date'] = pd.to_datetime(Nowcoder['date']).dt.date #日期
Nowcoder.drop_duplicates(subset=['user_id','date'],inplace=True) #去重
#merge实现左右连,on和how的参数都是带引号的,还可以指定相同列的下标,不指定默认是_x,_y
new_Nowcoder = pd.merge(Nowcoder,Nowcoder,on='user_id',how='inner',suffixes=['_a','_b'])
new_Nowcoder['diff'] = new_Nowcoder['date_b'] - new_Nowcoder['date_a']
#两个时间之差数据类型就是timedelta类型
result = new_Nowcoder[new_Nowcoder['diff']==timedelta(days=1)]['diff'].count() / new_Nowcoder[new_Nowcoder['diff']==timedelta(days=0)]['diff'].count()
print(round(result,2))
31、牛客网每日正确与错误的答题次数
现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
请统计2021年12月答题结果正确和错误的前提下每天的答题次数。
import pandas as pd
Nowcoder = pd.read_csv('nowcoder.csv',sep=',')
Nowcoder['year-month-day'] = pd.to_datetime(Nowcoder['date']).dt.date
# groupby函数对result和year-month-day列进行分组
sum = Nowcoder.groupby(by=['result','year-month-day'])['year-month-day'].count()
print(sum)
32、牛客网答题正误总数
现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
请统计答对和答错的总数分别是多少。
import pandas as pd
Nowcoder = pd.read_csv('nowcoder.csv',sep=',')
sum = Nowcoder.groupby('result')['result'].count()
print(sum)
33、牛客网连续练习题目3天及以上的用户
现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
请统计2021年12月连续练习题目3天及以上的所有用户。
输出连续3天及以上的用户及对应的连续天数,以上数据集的输出结果如下:
解法一(SQL思路):
import pandas as pd
from datetime import timedelta
Nowcoder = pd.read_csv('nowcoder.csv',sep=',')
# 日期格式
Nowcoder['date1'] = pd.to_datetime(Nowcoder['date']).dt.date
# 去重
Nowcoder = Nowcoder.drop_duplicates(subset=['user_id','date1'])
# 筛选2021年12月数据
Nowcoder = Nowcoder[(pd.to_datetime(Nowcoder['date1']).dt.year==2021)&(pd.to_datetime(Nowcoder['date1']).dt.month==12)]
# 根据user_id分组,根据date1排名
Nowcoder['rank'] = pd.to_timedelta(Nowcoder.groupby('user_id')['date1'].transform('rank'),unit='d')
# 两列相减,值相同的为连续天
Nowcoder['diff'] = Nowcoder['date1'] - Nowcoder['rank']
# 连续天计数
counts = Nowcoder.groupby(['user_id','diff'])['date1'].count()
# 筛选连续天数大于等于3天的数据
counts = counts[counts>=3]
# 筛选每个user_id的最大连续天数
print(counts.reset_index().groupby('user_id')['date1'].max())
解法二(循环思路):
import pandas as pd
from datetime import timedelta
nowcoder=pd.read_csv('nowcoder.csv',sep=',')
#排序,默认升序
nowcoder=nowcoder.sort_values(by=['user_id','date'])
#提取年月日
nowcoder['date']=pd.to_datetime(nowcoder['date']).dt.date
#去重
nowcoder=nowcoder.drop_duplicates(subset=['user_id','date'])
#筛选2021年12月数据
nowcoder=nowcoder[(pd.to_datetime(nowcoder['date']).dt.year==2021)&(pd.to_datetime(nowcoder['date']).dt.month==12)]
#新建列,连续天数,默认1天
nowcoder['con_days']=1
#更新连续天数
for i in range(nowcoder.shape[0]):
if i>0:
if nowcoder['user_id'].iloc[i]==nowcoder['user_id'].iloc[i-1]:
if nowcoder['date'].iloc[i]==nowcoder['date'].iloc[i-1]+timedelta(1):
nowcoder['con_days'].iloc[i]=nowcoder['con_days'].iloc[i-1]+1
#根据user_id分组,取最大连续天数
print(nowcoder.groupby('user_id')['con_days'].max())
34、牛客网不同毕业年份的大佬
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
按照毕业年份顺序输出每年毕业生中的最高成就值。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
sum = Nowcoder.groupby('Graduate_year')['Achievement_value'].count()
print(sum)
35、不同等级用户语言使用情况
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
按照等级顺序输出每个等级下每种常用语言的使用人数,输出包括最后的dtype。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
result = Nowcoder.groupby(['Level','Language'])['Nowcoder_ID'].count()
print(result)
36、总人数超过5的等级
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
按照等级顺序输出人数大于5的等级中每个等级的人数,输出包括最后的dtype。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
result = Nowcoder.groupby('Level')['Nowcoder_ID'].count()
print(result[result>5])
合并
37、统计运动会项目报名人数
某公司计划举办一场运动会,现有运动会项目数据集items.csv。 包含以下字段:
item_id:项目编号;
item_name:项目名称;
location:比赛场地。
有员工报名情况数据集signup.csv。包含以下字段:
employee_id:员工编号;
name:员工姓名;
sex:性别;
department:所属部门;
item_id:报名项目id
请统计各类型项目的报名人数。
只输出报名人数不为0的项目及其对应的报名人数。以上数据集的输出如下:
import pandas as pd
Nowcoder1 = pd.read_csv('items.csv',sep=',')
Nowcoder2 = pd.read_csv('signup.csv',sep=',')
Nowcoder = pd.merge(left=Nowcoder1, right=Nowcoder2, how='inner', left_on='item_id', right_on='item_id')
Nowcoder = Nowcoder.groupby('item_name')['employee_id'].count()
print(Nowcoder[Nowcoder>0])
38、统计运动会项目报名人数(二)
某公司计划举办一场运动会,现有运动会项目数据集items.csv。 包含以下字段:
item_id:项目编号;
item_name:项目名称;
location:比赛场地。
有员工报名情况数据集signup.csv。包含以下字段:
employee_id:员工编号;
name:员工姓名;
sex:性别;
department:所属部门;
item_id:报名项目id
输出items.csv中所有项目的报名人数(没有人报名的项目的报名人数输出为0即可)。
import pandas as pd
Nowcoder1 = pd.read_csv('items.csv')
Nowcoder2 = pd.read_csv('signup.csv')
Nowcoder = pd.merge(Nowcoder1,Nowcoder2,how='inner',on='item_id')
Nowcoder = Nowcoder.groupby('item_name')['employee_id'].count()
print(Nowcoder)
39、 多报名表的运动项目人数统计
某公司计划举办一场运动会,现有部分运动会项目数据集items.csv。 包含以下字段:
item_id:项目编号;
item_name:项目名称;
location:比赛场地。
有员工报名情况数据集signup.csv。包含以下字段:
employee_id:员工编号;
name:员工姓名;
sex:性别;
department:所属部门;
item_id:报名项目id。
另有signup1.csv,是education部门的报名情况,包含字段同signup.csv。
请你将signup.csv与signup1.csv的数据集合并后,统计各类型项目的报名人数。
只输出报名人数不为0的项目及其对应的报名人数。
import pandas as pd
items = pd.read_csv('items.csv')
signup1 = pd.read_csv('signup.csv')
signup2 = pd.read_csv('signup1.csv')
signup = pd.concat([signup1,signup2])
Nowcoder = pd.merge(items,signup,how='inner',on='item_id')
Nowcoder = Nowcoder.groupby('item_name')['employee_id'].count()
print(Nowcoder)
import pandas as pd
df1 = pd.read_csv('items.csv')
df2 = pd.read_csv('signup.csv')
df3 = pd.read_csv('signup1.csv')
df = df1.merge(pd.concat([df2,df3]),on='item_id').groupby('item_name').employee_id.count()
print(df)
40、统计职能部分运动会某项目的报名信息
某公司计划举办一场运动会,现有运动会项目数据集items.csv。 包含以下字段:
item_id:项目编号;
item_name:项目名称;
location:比赛场地。
有员工报名情况数据集signup.csv。包含以下字段:
employee_id:员工编号;
name:员工姓名;
sex:性别;
department:所属部门;
item_id:报名项目id
请你统计职能部门(functional)中报名标枪(javelin)的所有员工的员工编号(employee_id)、姓名(name)及性别(sex)。(注意:结果中行标签从0开始顺序排序):
import pandas as pd
items = pd.read_csv('items.csv')
signup = pd.read_csv('signup.csv')
Nowcoder = pd.merge(items,signup,how='inner',on='item_id')
Nowcoder = Nowcoder[(Nowcoder['department']=='functional')&(Nowcoder['item_name']=='javelin')]
# reset_index用来重置索引,因为有时候对dataframe做处理后索引可能是乱的。
# drop=True就是把原来的索引index列去掉,重置index。
# drop=False就是保留原来的索引,添加重置的index。
print(Nowcoder[['employee_id','name','sex']].reset_index(drop = True))
41、运动会各项目报名透视表
某公司计划举办一场运动会,现有运动会项目数据集items.csv。 包含以下字段:
item_id:项目编号;
item_name:项目名称;
location:比赛场地。
有员工报名情况数据集signup.csv。包含以下字段:
employee_id:员工编号;
name:员工姓名;
sex:性别;
department:所属部门;
item_id:报名项目id
请输出下图所示的透视表。其中行索引键为sex、department,列索引键为item_name。数值为报名对应项目的人数。如education部门男性中报名longJump的人数为1人。
import pandas as pd
items = pd.read_csv('items.csv')
signup = pd.read_csv('signup.csv')
Nowcoder = pd.merge(signup,items,how='left',on='item_id')
# 使用pivot转化,其中values要加括号才行,否则不显示
res = pd.pivot_table(
Nowcoder,
values=['employee_id'],
index=['sex','department'],
columns='item_name',
aggfunc='count',
fill_value = 0 # 填充空值,填充值为0
)
print(res)
42、合并用户信息表与用户活跃表
现有一个Nowcoder1.csv文件,记录了牛客网的部分用户的个人信息,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
另外一个Nowcoder2.csv文件记录了用户的活跃情况,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
输出合并后的完整表格。
import pandas as pd
Nowcoder1 = pd.read_csv('Nowcoder1.csv')
Nowcoder2 = pd.read_csv('Nowcoder2.csv')
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 设置显示最大行
pd.set_option('display.max_columns', None)
Nowcoder = pd.merge(Nowcoder1,Nowcoder2,how='inner',on='Nowcoder_ID')
print(Nowcoder)
43、两份用户信息表格中的查找
现有一个Nowcoder1.csv文件,记录了牛客网的部分用户的个人信息,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
另外一个Nowcoder2.csv文件记录了用户的活跃情况,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交代码次数
Last_submission_time:最后一次提交题目日期
输出用户的名字、刷题量和代码提交次数,包括行号。
import pandas as pd
Nowcoder1 = pd.read_csv('Nowcoder1.csv',sep=',')
Nowcoder2 = pd.read_csv('Nowcoder2.csv',sep=',')
Nowcoder = pd.merge(Nowcoder1,Nowcoder2,how='inner',on='Nowcoder_ID')
print(Nowcoder[['Name','Num_of_exercise','Number_of_submissions']])
44、某店铺消费最多的前三名用户
现有某店铺会员消费情况sales.csv。包含以下字段:
user_id:会员编号;
recency:最近一次消费距离当天的天数;
frequency:一段时间内消费的次数;
monetary:一段时间内消费的总金额。
输出销售金额最多的前3名用户,索引从0开始。
import pandas as pd
Nowcoder = pd.read_csv('sales.csv')
# reset_index 用来重置索引,因为有时候对 dataframe 做处理后索引可能是乱的。
# drop=True 就是把原来的索引 index 列去掉,重置 index。
# drop=False 就是保留原来的索引,添加重置的 index。
data = Nowcoder.sort_values(by='monetary',ascending=False).reset_index(drop=True)[:3]
print(data)
45、按照等级递增序查看牛客网用户信息
现有一个Nowcoder.csv文件,记录了牛客网的部分用户的个人信息,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Name:用户名
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
按照1-7级的递增序查看这些用户数据,输出排序后的全部数据,包括行号。
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',')
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 设置显示最大行
pd.set_option('display.max_columns', None)
data = Nowcoder.sort_values(by='Level')
print(data)
函数
46、某店铺用户消费特征评分
现有某店铺会员消费情况sales.csv。包含以下字段:
user_id:会员编号;
recency:最近一次消费距离当天的天数;
frequency:一段时间内消费的次数;
monetary:一段时间内消费的总金额。
请你分别对每个用户的每个消费特征进行评分。
请对每个用户销售情况的每个特征进行评分,分值为1-4分。对于recency特征,值越小越好。对于frequency和monetary值越大越好。请分别将对应的数据进行四等分并评分,如对于recency:
数值小于等于下四分位数则评为4分;
大于下四分位数并且小于等于中位数则评为3分;
大于中位数且小于等于上四分位数则评为2分;
大于上四分位数则评为1分。
对于frequency和monetary则方法刚好相反。
要求给所有数据进行评分,并输出前5行。以上数据的输出结果如下:
import pandas as pd
sales = pd.read_csv('sales.csv')
sales['R_Quartile'] = pd.qcut(sales['recency'],[0,0.25,0.5,0.75,1],["4","3","2","1"]).astype("int")
sales['F_Quartile'] = pd.qcut(sales['frequency'],[0,0.25,0.5,0.75,1],["1","2","3","4"]).astype("int")
sales['M_Quartile'] = pd.qcut(sales['monetary'],[0,0.25,0.5,0.75,1],["1","2","3","4"]).astype("int")
# 使用astype()将纯数字组成的字符串修改成int
print(sales.head(5))
47、筛选某店铺最有价值用户中消费最多前5名
现有某店铺会员消费情况sales.csv。包含以下字段:
user_id:会员编号;
recency:最近一次消费距离当天的天数;
frequency:一段时间内消费的次数;
monetary:一段时间内消费的总金额。
请先对每个用户销售情况的每个特征进行评分,分值为1-4分。再将所有评分拼接到一起形成新的列RFMClass。
评分规则如下: 对于recency特征,值越小越好。对于frequency和monetary值越大越好。如对于recency:
数值小于等于下四分位数则评为4分;
大于下四分位数并且小于等于中位数则评为3分;
大于中位数且小于等于上四分位数则评为2分;
大于上四分位数则评为1分。
对于frequency和monetary则方法刚好相反。
请输出评分后的数据的前5行并输出最有价值的用户(评分为“444”)中销售总金额最高的前5位(索引从0开始),以上数据集的输出如下图所示(两次输出之间有一个空行)。
import pandas as pd
sales = pd.read_csv('sales.csv')
R = pd.qcut(sales['recency'],4,["4","3","2","1"]).astype('str')
F = pd.qcut(sales['frequency'],4,["1","2","3","4"]).astype('str')
M = pd.qcut(sales['monetary'],4,["1","2","3","4"]).astype('str')
sales['RFMClass'] = R+F+M
print(sales.head(5))
print('\n')
print(sales[sales['RFMClass']=='444'].sort_values('mometary',ascending=False).head(5))