【Nowcoder牛客刷题记录】——Python数据分析(二)

简介: 【Nowcoder牛客刷题记录】——Python数据分析

五、数据清洗


DA24 去掉信息不全的用户

121430a1cf0b495b8da7a37f769ca8b0.png

dropna()用法:


DataFrme.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)

参数:

axis: 默认axis=0。0为按行删除,1为按列删除

how: 默认 ‘any’。 ‘any’指带缺失值的所有行/列; 'all’指清除一整行/列都是缺失值的行/列

thresh: int,保留含有int个非nan值的行

subset: 删除特定列中包含缺失值的行或列


inplace: 默认False,即筛选后的数据存为副本,True表示直接在原数据上更改。


importpandasaspdNowcoder=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())

DA25 修补缺失的用户数据

0317bddfc57b4780ae42ecbf5c0b4a0b.png

importpandasaspddf=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)
df['Graduate_year'].fillna(df['Graduate_year'].max(),inplace=True)
df['Language'].fillna('Python',inplace=True)
df['Achievement_value'].fillna(int(df['Achievement_value'].mean()),inplace=True)
print(df)

DA26 解决牛客网用户重复的数据

2eb20a35df114c15b49022f276f0be29.png


importpandasaspddf=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())

DA27 统一最后刷题日期的格式

bb4cf3535a00450a8c9baed9d37b2ebf.png


importpandasaspddf=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
#df['Last_submission_time'] =pd.to_datetime(df["Last_submission_time"],format="%Y-%m-%d")
#很神奇df['Last_submission_time'] =pd.to_datetime("2022-01-01")
print(df[['Nowcoder_ID','Level','Last_submission_time']])


六、Json处理


DA28 将用户的json文件转换为表格形式

现有一个Nowcoder.json文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):


Nowcoder_ID:用户ID


Level:等级


Achievement_value:成就值


Graduate_year:毕业年份


Language:常用语言


如果你读入了这个json文件,能将其转换为pandas的DataFrame格式吗?

c57912e9287f44e48384763c876cdbd5.png


importpandasaspdimportjsonpd.set_option('display.width', 300)  #设置字符显示宽度pd.set_option('display.max_rows', None)  #设置显示最大行pd.set_option('display.max_columns', None)
withopen('Nowcoder.json', 'r') asf:
data=json.loads(f.read())
print(pd.DataFrame(data))
df=pd.read_json("Nowcoder.json")
print(df)


七、分组聚合


DA29 牛客网的每日练题量

061f39485b5644b395260df9501da7c0.png


importpandasaspdimportdatetimeasdtdf=pd.read_csv("nowcoder.csv")
#将date转换为日期格式df["date"] =pd.to_datetime(df["date"]).dt.date#筛选统计区间2021年12月data=df[(df["date"] >=dt.date(2021, 12, 1)) & (df["date"] <=dt.date(2021, 12, 31))]
#使用groupby按照date分组,聚合函数count统计题目数量daily_num=data.groupby("date")["question_id"].count()
print(daily_num)

DA30 牛客网用户练习的平均次日留存率

b3c9bc7b336f4c8b9057efc18d493ba0.png


这题有点难 没看懂


importpandasaspdfromdatetimeimporttimedeltanowcoder=pd.read_csv('nowcoder.csv')
#总数total_id=nowcoder['user_id'].count()
b=pd.merge(nowcoder,nowcoder,on='user_id')
#merge之后的列名:user_id,question_id_x,result_x,date_x,question_id_y,result_y,date_y#是自动区分xy的b['date_x'] =pd.to_datetime(b.date_x).dt.date#to_datetime默认有时间精度,.dt.date去掉分钟,得到日期列表2021-12-1b['date_y'] =pd.to_datetime(b.date_y).dt.dateb['differ'] =b.date_y-b.date_xsum_diff=b[b.differ=='1 days'].differ.count()
res=round(sum_diff/total_id,2)
print(res)


DA31 牛客网每日正确与错误的答题次数

现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):

  • user_id:用户id
  • question_id:问题编号
  • result:运行结果
  • date:练习日期

请你统计2021年12月答题结果正确和错误的前提下每天的答题次数。

bab58ace79ea4ad4ae8ecaf9abc9beeb.png


importpandasaspdnowcoder=pd.read_csv('nowcoder.csv')
nowcoder['year-month-day'] =pd.to_datetime(nowcoder['date']).dt.dateprint(nowcoder.groupby(['result','year-month-day'])['question_id'].count())

DA32 牛客网答题正误总数

f2ccb2dc98b64b32a0dd7e8df446c06a.png


//

importpandasaspdnowcoder=pd.read_csv('nowcoder.csv')
a=nowcoder.groupby("result")
print(a.size())

DA33 牛客网连续练习题目3天及以上的用户


862340e650004050bd6b9cb5c04b2dae.png

这题有点难:


大佬的解答,虽然没通过,但是非常细。



importpandasaspdfromdatetimeimporttimedeltanowcoder=pd.read_csv("nowcoder.csv")
#-----N日留存#格式化日期年月nowcoder["date1"] =pd.to_datetime(nowcoder["date"]).dt.strftime("%Y-%m")
#格式化日期年月日nowcoder["date2"] =pd.to_datetime(nowcoder["date"]).dt.strftime("%Y%m%d")
#将年月日换成整型,便于运算nowcoder["date2"] =nowcoder["date2"].astype("int")
#将日期加+1,便于后期的连续日期判断nowcoder["date3"] =nowcoder["date2"].apply(lambdax: x+1)
#按要求筛选出满足年月的数据nowcoder_1=nowcoder[nowcoder["date1"] =="2021-12"]
#获取排名-1,最小日期的排名应该是0nowcoder_1["rk"] = (
nowcoder_1.groupby(by="user_id")
    .date2.rank(axis=1, ascending=True, method="dense")
    .apply(lambdax: x-1)
)
#获取满足连续日数据并去重nowcoder_2=pd.merge(
nowcoder_1[["user_id", "date", "date2", "rk"]],
nowcoder_1[["user_id", "date3"]],
left_on=["user_id", "date2"],
right_on=["user_id", "date3"],
).drop_duplicates()
#连续日期减去排名等于最小日期nowcoder_2["date4"] = (
nowcoder_2[["date3", "rk"]].apply(lambdax: x[0] -x[1], axis=1).astype("int")
)
#得出次数+1DAU= (
nowcoder_2[["user_id", "date4"]]
    .groupby(by="user_id")["user_id"]
    .count()
    .apply(lambdax: x+1)
)
print(DAU[DAU>=3])


'''代码已通过,两个要点:1.先去掉date的时间,再转为日期格式;2.对user_id和答题日期去重。'''importpandasaspdfromdatetimeimporttimedeltanowcoder=pd.read_csv('nowcoder.csv')
nowcoder['date'] =pd.to_datetime(nowcoder['date'].str.split(' ', expand=True).iloc[:,0]) #去掉时间,然后将字符串转为日期格式df=nowcoder[nowcoder['date'].dt.strftime("%Y-%m") =='2021-12'][['user_id','date']].drop_duplicates() #筛选12月的数据,只取user_id和答题日期,并去重df['rk'] =pd.to_timedelta(df.groupby(['user_id'])['date'].rank(),unit='d') #根据user_id分组,并根据答题日期date排序;将排序转为日期差rk,以天为单位df['diff'] =df['date']-df['rk'] #答题日期减去日期差rk,得到diff;同一个用户同一次连续答题,会有一样的diff值df1=df.groupby(['user_id','diff']).count() #得到每个用户每次连续答题的天数df2=df1.groupby('user_id')['rk'].max() #取用户最大连续答题天数print(df2[df2>=3])


DA34 牛客网不同毕业年份的大佬

c214196e42604e08b2ccdec934e8537c.png


easy


importpandasaspddf=pd.read_csv("Nowcoder.csv", sep=",")
print(df.groupby(["Graduate_year"]).Achievement_value.max())

DA35 不同等级用户语言使用情况


0817d3779fe640af81f0d8d5df8738c6.png

easy


importpandasaspdNowcoder=pd.read_csv('Nowcoder.csv', sep=',')
print(Nowcoder.groupby(['Level','Language']).Nowcoder_ID.count())

DA36 总人数超过5的等级

ce4d91cd93b54b01978c1e9201f94e31.png


importpandasaspddf=pd.read_csv('Nowcoder.csv', sep=',')
print(df.groupby(['Level']).Nowcoder_ID.count()>5)


八、合并


DA37 统计运动会项目报名人数

31c02bc908804463a6fe3fb52ea25074.png


ff671e772c3f435a98e31c8f9d4990b6.png

db8617bd35044dab860280eff52154a9.png



importpandasaspd#员工signup=pd.read_csv('signup.csv')
#项目items=pd.read_csv('items.csv')
#合并数据data=pd.merge(items, signup, on='item_id', how='inner')
cnt=data.groupby(by='item_name')['item_name'].count()
print(cnt)

DA38 统计运动会项目报名人数(二)

97f05d6015e548f8b94b571e6e8c8d37.png


importpandasaspdsignup=pd.read_csv('signup.csv')
items=pd.read_csv('items.csv')
#合并data=pd.merge(items, signup, on='item_id', how='left')
cnt=data.groupby(by='item_name')['employee_id'].count()
#print(cnt)

DA39 多报名表的运动项目人数统计

af3c9985211d4c6eb33d274ecb19c425.png

1187b007b4d0447d98d457244bbb4479.png


importpandasaspdsignup=pd.read_csv("signup.csv")
signup1=pd.read_csv("signup1.csv")
items=pd.read_csv("items.csv")
#级联员工表signup2=pd.concat([signup, signup1], axis=0)
#合并data=pd.merge(items, signup2, on="item_id", how="inner")
cnt=data.groupby(by="item_name")["item_name"].count()
print(cnt)

DA40 统计职能部分运动会某项目的报名信息

0bd8a59af2a746d9951cb064f2c3d2c0.png

importpandasaspditems=pd.read_csv("items.csv")
signup=pd.read_csv("signup.csv")
#合并data=pd.merge(items, signup)
result= (
data.query("item_name == 'javelin'&department == 'functional'")
    .loc[:, ["employee_id", "name", "sex"]]
    .reset_index(drop=True)
)
#reset_index是重置索引,原来的索引默认作为数据列保留,若不想要保留则设置参数drop=Trueprint(result)


DA41 运动会各项目报名透视表

请你输出报名的各个项目情况(不包含没人报名的项目)对应的透视表。

204592172fa944919f584cc025d59e10.png

56487cfa29f34a868a90d20c21afdc73.png



importpandasaspdsignup=pd.read_csv("signup.csv")
items=pd.read_csv("items.csv")
data=pd.merge(signup, items, on="item_id", how="inner")
data1=data.pivot_table(index=["sex", "department"], 
columns="item_name", 
aggfunc={'employee_id':'size'},  
fill_value=0)
print(data1)

DA42 合并用户信息表与用户活跃表

e6888312e63c46edb36e3561d3e61633.png


importpandasaspdpd.set_option('display.width', 300)  #设置字符显示宽度pd.set_option('display.max_rows', None)  #设置显示最大行pd.set_option('display.max_columns', None)
Nowcoder1=pd.read_csv('Nowcoder1.csv', sep=',')
Nowcoder2=pd.read_csv('Nowcoder2.csv', sep=',')
print(pd.merge(Nowcoder1,Nowcoder2,on='Nowcoder_ID'))

DA43 两份用户信息表格中的查找

16f1ab14c2a64c19946a819cccbc2316.png


importpandasaspdN1=pd.read_csv('Nowcoder1.csv')
N2=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)
#合并data=pd.merge(N1,N2,how='outer')
result=data.loc[:,['Name','Num_of_exercise','Number_of_submissions']]
print(result)


九、排序


DA44 某店铺消费最多的前三名用户

d793b76f23234bd2bd0e3065fd49c44f.png


importpandasaspdsales=pd.read_csv('sales.csv')
data=sales.sort_values(by='monetary', ascending=False).reset_index(drop=True)[:3]
print(data)

c53d9731e0c445fd9bc36c8c4cde90d8.png


DA45 按照等级递增序查看牛客网用户信息

2bec3acb5ca3426281ac4fef23d5082b.png


importpandasaspdpd.set_option('display.width', 300)  #设置字符显示宽度pd.set_option('display.max_rows', None)  #设置显示最大行pd.set_option('display.max_columns', None)
Nowcoder=pd.read_csv('Nowcoder.csv', sep=',')
df=Nowcoder.sort_values(by='Level',ascending=True)
print(df)


十、函数


DA46 某店铺用户消费特征评分

fd03ebb83d304ce18f6e1a50dab18fb1.png


importpandasaspdsales=pd.read_csv('sales.csv')
#按照结果要求转换类型sales[['monetary']] =sales[['monetary']].astype('float32')
#求百分位des=sales[['recency', 'frequency', 'monetary']].describe().loc['25%':'75%']
#计算RFMsales['R_Quartile'] =sales['recency'].apply(lambdax: 4ifx<=des.iloc[0,0] else (3ifx<=des.iloc[1,0] else (2ifx<=des.iloc[2,0] else1)))
sales['F_Quartile'] =sales['frequency'].apply(lambdax: 1ifx<=des.iloc[0,1] else (2ifx<=des.iloc[1,1] else (3ifx<=des.iloc[2,1] else4)))
sales['M_Quartile'] =sales['monetary'].apply(lambdax: 1ifx<=des.iloc[0,2] else (2ifx<=des.iloc[1,2] else (3ifx<=des.iloc[2,2] else4)))
print(sales.head())

DA47 筛选某店铺最有价值用户中消费最多前5名

ed386ca2fc5b47ff96c5530b47fedbb9.png


176e81816d19478f95887266a46a0c01.png


importpandasaspdsales=pd.read_csv("sales.csv")
#按照结果要求转换类型sales[["monetary"]] =sales[["monetary"]].astype("float32")
#求百分位des=sales[["recency", "frequency", "monetary"]].describe().loc["25%":"75%"]
#计算RFMR= (
sales["recency"]
    .apply(
lambdax: 4ifx<=des.iloc[0, 0]
目录
相关文章
|
22天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
53 0
|
8天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第42天】本文将介绍如何使用Python进行数据分析和可视化。我们将从数据导入、清洗、探索性分析、建模预测,以及结果的可视化展示等方面展开讲解。通过这篇文章,你将了解到Python在数据处理和分析中的强大功能,以及如何利用这些工具来提升你的工作效率。
|
17天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
35 2
|
23天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
31 2
|
29天前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
30 2
|
6天前
|
数据采集 数据可视化 数据挖掘
掌握Python数据分析,解锁数据驱动的决策能力
掌握Python数据分析,解锁数据驱动的决策能力
|
14天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
14天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
16天前
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
17天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
下一篇
无影云桌面