01 查看数据
数据集
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
知识点
pandas读取
pd.read_csv()
DataFrame.shape
DataFrame.columns
DataFrame.loc( )
DataFrame.iloc( )
题目
DA1 用pandas查看牛客网用户数据
你可以使用pandas打开文件,请输出你看到的前6行数据
输入描述:数据集直接从当前目录下的Nowcoder.csv文件中读取
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Nowcoder.head(6))
pandas读取
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行数据显示出来,默认后五行
最后打印即可
pd.read_csv()
常用参数:
sep :指定分隔符
header:指定表头行。默认为0,如果没有表头,设置为None
index_col:将某一列设置为索引
usecols:选择读取的列。你可以传入一个列名的列表,或者一个整数列表来表示列的索引
na_values:指定哪些值应被视为NaN(缺失值)
dtype:指定列的数据类型(谨慎使用,具体情况具体分析,容易报错)
data = pd.read_csv('data.csv',sep=',', header=None,index_col=0,usecols=['IntColumn', 'FloatColumn'],na_values=['N/A', 'nan'],dtype={'StringColumn': str, 'IntColumn': int})
DA2 牛客网用户数据集的大小
请直接告诉我们这个数据集的行数与列数
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.shape) #.shape
print((len(Now),len(Now.columns))) #.columns
数据集大小
DataFrame.shape
DataFrame.columns
columns表示获取数据框的列,DataFrame.columns属性返回给定Dataframe的列标签
DA3 牛客网的第10位用户
输出这个数据集中第10行的用户的全部信息
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.loc[10])
DataFrame.loc( )
loc方法通过行、列的名称或者标签来寻找我们需要的值
# 读取第1行,第B列对应的值
data= data.loc[ 1, "B"]
# 读取第1行到第3行,第B列到第D列这个区域内的值
data= data.loc[ 1:3, "B":"D"]
# 读取第B列中大于6的值
data= data.loc[ data.B > 6]
# 切片操作,选择B,C,D,E四列区域内,B列大于6的值
data1 = data.loc[ data.B >6, ["B","C","D","E"]]
DataFrame.iloc( )
iloc方法通过索引行、列的索引位置[index, columns]来寻找值
# 读取第二行,第二列的值
data= data.iloc[1, 1]
# 按index和columns进行切片操作 读取第2、3行,第3、4列
data= data.iloc[1:3, 2:4]
DA4 统计牛客网部分用户使用语言
输出这个数据集中第10行到第20行的用户的常用语言分别是什么
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.loc[10:21,'Language'])
02 数据索引
知识点
isnull()函数
df.isnull().any()
df.isnull().sum()
axis=1或0
df.query()
df.apply()
df.head(n)
df.tail(n)
题目
DA5 牛客网用户没有补全的信息
输出每列信息是否有为空值
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.isnull().any(axis=0))
isnull:
any:返回是否至少一个元素为真
all:返回是否所有元素为真
axis=1或0:1表示横轴,方向从左到右;0表示纵轴,方向从上到下
isnull()函数
isnull()函数用来判断缺失值,判断是否为空,返回bool类型的值:True or False
对于以下数据集,运行isnull()
0 1 2 3 4
0 63.0 89 58.0 94.0 10.0
1 44.0 77 66.0 54.0 14.0
2 25.0 41 93.0 56.0 NaN
3 43.0 26 27.0 53.0 44.0
4 NaN 98 45.0 32.0 45.0
5 NaN 28 NaN 72.0 10.0
6 69.0 92 NaN 24.0 61.0
7 51.0 22 35.0 NaN 72.0
8 83.0 32 93.0 62.0 25.0
9 48.0 54 83.0 30.0 79.0
df.isnull()
0 1 2 3 4
0 False False False False False
1 False False False False False
2 False False False False True
3 False False False False False
4 True False False False False
5 True False True False False
6 False False True False False
7 False False False True False
8 False False False False False
9 False False False False False
直接使用isnull()并不能很直观的反应缺失值的信息
df.isnull().any()
0 True
1 False
2 True
3 True
4 True
dtype: bool
df.isnull().any()会判断哪些列包含缺失值,该列存在缺失值则返回True,反之False
df.isnull().sum()
0 2
1 0
2 2
3 1
4 1
dtype: int64
isnull().sum()就直接告诉了我们每列缺失值的数量
axis=1或0
1表示横轴,方向从左到右;0表示纵轴,方向从上到下
DA6 查看牛客网哪些用户使用Python
如果你想知道哪些人经常使用Python这门语言,并且他们的其他信息是怎么样的,该怎么输出?
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.loc[Now.Language=='Python'])
query()方法
允许用户通过字符串表达式来筛选DataFrame中的数据,专门针对DataFrame的列名和值
基本用法
import pandas as pd
# 创建一个示例DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': ['p', 'q', 'r', 's']
}
df = pd.DataFrame(data)
# 使用query()方法筛选A列大于2的行
print(df.query('A > 2'))
使用逻辑运算符
import pandas as pd
# 创建一个示例DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': ['p', 'q', 'r', 's']
}
df = pd.DataFrame(data)
# 筛选A列大于2且B列小于等于7的行
filtered_df = df.query('A > 2 and B <= 7')
print(filtered_df)
使用字符串方法
import pandas as pd
# 创建一个示例DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': ['p', 'qu', 'r', 's']
}
df = pd.DataFrame(data)
# 筛选C列以'q'开头的行
filtered_df = df.query('C.str.startswith("q")')
print(filtered_df)
结合groupby()
import pandas as pd
# 创建一个示例DataFrame
data = {
'A': [1, 1, 2, 2, 3, 3, 4, 4],
'B': [5, 6, 6, 7, 7, 8, 8, 9],
'C': ['p', 'q', 'r', 's', 'p', 'q', 'r', 's']
}
df = pd.DataFrame(data)
# 按A列分组,并在每个组内筛选B列的最大值
grouped_df = df.groupby('A').apply(lambda x: x.query('B == B.max()'))
print(grouped_df)
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据结构传入给自己实现的函数中
在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数 会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回
import numpy as np
import pandas as pd
f = lambda x: x.max()-x.min()
t1 = df.apply(f)
t2 = df.apply(f, axis=1)
DA7 牛客网Python用户的成就值
输出牛客网的Python用户的成就值都有多高
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
print(Now.loc[Now.Language=='Python','Achievement_value'])
DA8 文件最后用户的部分数据
假设你想查看该文件最后5行用户的用户ID、等级、成就值、常用语言,请尝试输出
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',')
print(Now.loc[-5:,['Nowcoder_ID','Level','Achievement_value','Language']])
import pandas as pd
Now=pd.read_csv('Nowcoder.csv',sep=',')
print(Now[['Nowcoder_ID','Level','Achievement_value','Language']].tail(5))
df.head(n)
表示将前n行数据显示出来,默认是显示前五行
df.tail(n)
表示将后n行数据显示出来,默认后五行
03 逻辑运算
知识点
pd.set_option()
pd.set_option('display.width', 300)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
条件查询
df.loc[(df.Language=='C') | (df.Language=='CPP')]
df.query("Language == 'CPP' or Language == 'C'")
df.loc[df.Language.isin (["CPP", "C"]) ]
df.query("Language in ['CPP','C']")
df [ df['Language'].isin (['CPP','C','C#']) ]
题目
DA9 2020年毕业的人中最喜欢用Java的用户
如果你想知道哪些人是2020年毕业的,并且最常使用的语言是Java的,请输出他们的全部信息
设置显示一行的最大字符宽度为300,显示的最大行数为无限,显示的最大列数为无限
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[(Nowcoder['Graduate_year']==2020) & (Nowcoder['Language']=='Java')])
# 外面用双引号,里面字符串用单引号
print(Nowcoder.query("Graduate_year==2020 & Language=='Java'"))
pd.set_option()
设置 Pandas 显示选项
pd.set_option('display.width', 300) #设置显示一行的最大字符宽度为300
pd.set_option('display.max_rows', None) #设置显示的最大行数为无限
pd.set_option('display.max_columns', None) #设置显示的最大列数为无限
DA9 牛客网C系用户们的信息
统计使用CPP、C、C#的用户的全部信息
设置显示一行的最大字符宽度为300,显示的最大行数为无限,显示的最大列数为无限
import pandas as pd
pd.set_option('display.width', 300) # 设置字符显示宽度
pd.set_option('display.max_rows', None) # 设置显示最大行
pd.set_option('display.max_columns', None)
df=pd.read_csv('Nowcoder.csv',sep=',')
print(df.loc[(df.Language=='C')|(df.Language=='CPP')|(df.Language=='C#')])
print(Nowcoder[Nowcoder['Language'].isin (['CPP','C','C#'])])
print(Nowcoder.query("Language == 'CPP' or Language == 'C'"))
print(Nowcoder.query("Language in ['CPP','C']"))
print(Nowcoder.loc[Nowcoder.Language.isin(["CPP", "C"])])
DA10 统计牛客网刷题数量500以上的大佬
牛客网刷题数量不低于500题的大佬,他们的等级和成就值是怎么样的
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
print(df.loc[df.Num_of_exercise>500,['Level','Achievement_value']])
DA11 按照毕业年份与使用语言筛选牛客网7级用户
牛客网有哪些使用CPP的7级用户,且他们的毕业年份不是2018
设置显示一行的最大字符宽度为300,显示的最大行数为无限,显示的最大列数为无限
import pandas as pd
df=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(df.loc[(df.Language=='CPP') & (df.Level==7) & (df.Graduate_year != 2018)])
04 中级函数
数据集
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交题目数量
Last_submission_time:最后一次提交题目日期
知识点
df.value_counts()
unique()
nunique()
df['column'].median() 中位数
df['Level'].mode().to_frame() 众数
df['columns'].quantile(q=0.25) 分位数
describe()
count:数量统计,此列共有多少有效值
unipue:不同的值有多少个
std:标准差
min:最小值
max:最大值
mean:均值
25%:四分之一分位数
50%:二分之一分位数
75%:四分之三分位数
题目
DA12 牛客网不同语言使用人数
从这个csv文件中找到牛客网各种语言使用的用户分别有多少
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
counts=df['Language'].value_counts()
print(counts)
df.value_counts()
返回一个包含唯一值计数的Series,结果对象将按降序排列
用法: df.value_counts(normalize=False,sort=True,ascending=False, bins=None, dropna=True) normalize:如果为True,则返回的对象将包含唯一值的相对频率 sort:按值排序 ascending:升序排列 bins:不是对值进行计数,而是将它们分组到half-open箱中 dropna:不包括NaN计数
DA13 牛客网用户最近的最长与最短连续签到天数
最长的用户已经连续签到了多久,最短的用户又连续签到了多久
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
print(df['Continuous_check_in_days'].max(),df['Continuous_check_in_days'].min(),sep='\n')
DA14 Python用户的平均提交次数
牛客网Python用户都平均提交了多少次代码
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
print('{:.1f}'.format(df[df.Language=='Python']['Number_of_submissions'].mean()))
DA15 牛客网用户等级的中位数
统计所有用户等级的中位数,但是为了去掉一些非常不活跃的账号,只统计刷题数量不低于10题的那部分用户
import pandas as pd
df=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)
cond=df.Num_of_exercise>=10
median=df[cond]['Level'].median()
print(int(median))
df['column'].median() 中位数
DA16 用户常用语言有多少
这个文件中记录了多少种常用语言,一并输出这些语言的名字
import pandas as pd
Nowcoder = pd.read_csv('Nowcoder.csv', sep=',')
print(len(Nowcoder.Language.unique()))
print(list(Nowcoder.Language.unique()))
unique()
返回去重后的不同值
nunique()
直接放回不同值的个数
DA17 牛客网最多的用户等级
找到文件中等级的众数
import pandas as pd
df= pd.read_csv('Nowcoder.csv', sep=',')
grade=df['Level'].mode().to_frame()
print(grade)
df['Level'].mode().to_frame() 众数
DA18 用分位数分析牛客网用户活动
依次输出用户成就值与最近连续签到天数的四分之一分位数以及刷题量与代码提交次数的四分之三分位数
import pandas as pd
df= pd.read_csv('Nowcoder.csv', sep=',')
print(df[['Achievement_value','Continuous_check_in_days']].quantile(q=0.25))
print(df[['Num_of_exercise','Number_of_submissions']].quantile(q=0.75))
df['columns'].quantile(q=0.25) 分位数
describe()
desc = c.describe(include='all') # include='all',代表对所有列进行统计,如果不加这个参数,则只对数值列进行统计
统计值变量说明
count:数量统计,此列共有多少有效值
unipue:不同的值有多少个
std:标准差
min:最小值
max:最大值
mean:均值
25%:四分之一分位数
50%:二分之一分位数
75%:四分之三分位数
print(df.describe().loc[
"75%"
,[
"Num_of_exercise"
,
"Number_of_submissions"
]])
DA19 牛客网大佬之间的差距
从这份文件中输出7级用户中最高成就值与最低成就值之差
import pandas as pd
df= pd.read_csv('Nowcoder.csv', sep=',')
df=df.loc[df.Level==7]
print(int(df.Achievement_value.max())-int(df.Achievement_value.min()))
DA20 牛客用户刷题量的方差与提交次数的标准差
用户刷题量的方差以及提交代码次数的标准差
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
print(df.Num_of_exercise.var().round(2))
print(df.Number_of_submissions.std().round(2))
DA21 大佬用户成就值比例
7级大佬的成就值各自占据了所有人成就值总和的百分之多少
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
seven=df[df['Level']==7]['Achievement_value']#筛选出7级用户的成就值
total=df['Achievement_value'].sum()#计算出所有用户的成就值之和
print(seven/total)
DA22 牛客网用户最高的正确率
最高的正确率能有多少,只统计刷题数量大于10题的用户
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
a=df[df['Num_of_exercise']>10]['Num_of_exercise']
b=df[df['Num_of_exercise']>10]['Number_of_submissions']
print((a/b).max().round(3))
DA23 统计牛客网用户的名字长度
统计这些用户的名字长度
import pandas as pd
df=pd.read_csv('Nowcoder.csv',sep=',')
print(df['Name'].str.len())
05 数据清洗
知识点
df.dropna()
df.fillna()
df.duplicated(subset=None, keep='first')
df.drop_duplicates(subset=None, *, keep='first', inplace=False, ignore_index=False)
pd.to_datetime()
题目
DA24 去掉信息不全的用户
运营同学正在做用户调研,为了保证调研的可靠性,想要去掉那些信息不全的用户,即去掉有缺失数据的行,请去掉后输出全部数据
import pandas as pd
pd.set_option('display.width',300)
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None)
df=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
df.dropna(axis=1)
print(df)
df.dropna()
找到DataFrame类型数据的空值(缺失值),将空值所在的行/列删除后,将新的DataFrame作为返回值返回
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis:轴。0或'index',按行删除;1或'columns',按列删除。
how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列
thresh:非空元素最低数量,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列
subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
DA25 修补缺失的用户数据
使用当前的最大年份填充缺失的毕业年份(“Graduate_year”),用Python填充缺失的常用语言(“Language”),用成就值的均值(四舍五入保留整数)填充缺失的成就值(“Achievement_value”)
import pandas as pd
df = 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=df['Graduate_year'].max()
b=round(df['Achievement_value'].mean(),0)
df['Graduate_year']=df['Graduate_year'].fillna(a)
df['Language']=df['Language'].fillna('Python')
df['Achievement_value']=df['Achievement_value'].fillna(b)
print(df)
df.fillna()
使用指定的方法填充NA/NaN值
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value:用于填充的空值的值
method: {'backfill', 'bfill', 'pad', 'ffill', None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值
axis:轴。0或'index',表示按行删除;1或'columns',表示按列删除。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
DA26 解决牛客网用户重复的数据
系统错误将很多相同用户的数据输出了多条,导致文件中有很多重复的行,请先检查每一行是否重复,然后输出删除重复行后的全部数据
import pandas as pd
df=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(df.duplicated())
print(df.drop_duplicates())
df.duplicated(subset=None, keep='first')
返回 bool series 表示每行是否是重复的
- subset:column 标签
- keep:
- first,默认,标记除第一次出现以外的重复项为 True
- last,标记除最后一次出现以外的重复项为 True
- False,标记所有重复出现的为 True
df.drop_duplicates(subset=None, *, keep='first', inplace=False, ignore_index=False)
返回删除重复项后的 dataframe
- subset,与 duplicated 中的 subset 参数含义相同
- keep,与 duplicted 中的 subset 参数相同,first 则表示只保留第一次出现的 item
- inplace,是否原地修改
- ignore_index,如果为 True,则去重后的 index 重置为 0,1,...,n-1
DA27 统一最后刷题日期的格式
输出用户ID、等级以及统一后的日期(日期格式统一为yyyy-mm-dd)
import pandas as pd
df=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)
df['Last_submission_time']=pd.to_datetime(df['Last_submission_time'],format=('%Y-%m-%d'))
print(df.loc[:,['Nowcoder_ID','Level','Last_submission_time']])
pd.to_datetime()
pandas.to_datetime(arg, errors=’raise’, dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin=’unix’)
- arg:需要转化为日期类型的数据
- errors:默认为’raise’,表示如果存在无法转换的数据则抛出异常(ValueError),也可以设置为’coerce’,表示转换失败的数据将被设置为NULL,或者设置为’ignore’,表示忽略转换失败的数据
- dayfirst/yearfirst:默认为False/False,表示传入数据的月份位于字符串的哪一位。设置dayfirst=True时,表示日期在月份之前;设置yearfirst=True时,表示年份在月份之前
- utc:默认为None,表示将时区设置为UTC,也可以设置其他时区
- box:默认为True,表示返回的日期类型数据是否为pandas.Timestamp或pandas.DatetimeIndex,True表示为Timestamp或DatetimeIndex,False表示仅仅只是numpy.ndarray类型
- format:解析日期的格式字符串。 被解析的字符串中的每个元素必须单独对应格式字符串中的某个格式
- exact:默认为True,可以提高性能。但是,如果用户自定义日期格式字符串,则必须将其设置为False,否则此参数将被忽略
- unit:仅在被转换的数据是一个UNIX时间戳时使用,表示时间的单位
- infer_datetime_format:默认为False,表示是否启用推断方式解析日期。这将会运用推断方式使pandas快速解析性能更高
06 Json处理
DA28 将用户的json文件转换为表格形式
现有一个Nowcoder.json文件读入了这个json文件,将其转换为pandas的DataFrame格式
import pandas as pd
df=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(pd.DataFrame(df))
JSON转换
将其转换成dataframe格式:
data_=pd.Dataframe(data)
07 分组聚合
数据集
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
知识点
题目
DA29 牛客网的每日练题量
请你统计2021年12月每天练习题目的数量
import pandas as pd
df=pd.read_csv('nowcoder.csv',sep=',',index_col='date')
data=df.groupby('date')['question_id'].count()
print(data)
DA30 牛客网用户练习的平均次日留存率
计算用户练习的平均次日留存率
import pandas as pd
# 读文件
df = pd.read_csv('nowcoder.csv', sep=',')
# 转换日期格式
df['date'] = pd.to_datetime(df['date']).dt.date # .dt.date得到精确到天的日期
# 拷贝原表于新表df1
df1 = df.copy()
# 将新表的时间+1天(往后推一天)
df1['date'] = df1['date'] + pd.Timedelta(days=1)
# 将原表df和新表合并得到新表total,内连接取交集,键/连接字段 是 userid和date
total = pd.merge(df,df1, how='inner', on=['user_id','date'])
# 统计合并后剩下的第二天还会再来练习的人数n
n = total['user_id'].count()
# 统计原表中的用户数n1
n1 = df['user_id'].count()
# 计算次日留存率
print(round(n / n1 ,2))
DA3
较难07.31%
DA4
中等19.73%
DA5
较难03.86%
DA6
中等12.75%
DA7
中等14.85%
DA8
中等13.33%
08 合并
合并
DA1
中等16.12%
DA2
中等27.48%
DA3
较难13.85%
DA4
较难05.56%
DA5
中等09.14%
DA6
简单10.56%
DA7
简单20.05%
09 排序
排序
DA1
简单10.36%
DA2
简单14.32%
010 函数
函数
DA1
较难08.25%
DA2
较难06.28%