赞
踩
现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
你可以使用pandas打开文件,请输出你看到的前6行数据
输入描述:数据集直接从当前目录下的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行数据显示出来,默认后五行
最后打印即可
常用参数:
sep :指定分隔符
header:指定表头行。默认为0,如果没有表头,设置为None
index_col:将某一列设置为索引
usecols:选择读取的列。你可以传入一个列名的列表,或者一个整数列表来表示列的索引
na_values:指定哪些值应被视为NaN(缺失值)
dtype:指定列的数据类型(谨慎使用,具体情况具体分析,容易报错)
请直接告诉我们这个数据集的行数与列数
- import pandas as pd
- Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
-
- print(Now.shape) #.shape
- print((len(Now),len(Now.columns))) #.columns
columns表示获取数据框的列,DataFrame.columns属性返回给定Dataframe的列标签
输出这个数据集中第10行的用户的全部信息
- import pandas as pd
- Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
- print(Now.loc[10])
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"]]
iloc方法通过索引行、列的索引位置[index, columns]来寻找值
- # 读取第二行,第二列的值
- data= data.iloc[1, 1]
-
- # 按index和columns进行切片操作 读取第2、3行,第3、4列
- data= data.iloc[1:3, 2:4]
输出这个数据集中第10行到第20行的用户的常用语言分别是什么
- import pandas as pd
- Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
- print(Now.loc[10:21,'Language'])
输出每列信息是否有为空值
- 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()函数用来判断缺失值,判断是否为空,返回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()并不能很直观的反应缺失值的信息
- 0 True
- 1 False
- 2 True
- 3 True
- 4 True
- dtype: bool
df.isnull().any()会判断哪些列包含缺失值,该列存在缺失值则返回True,反之False
- 0 2
- 1 0
- 2 2
- 3 1
- 4 1
- dtype: int64
isnull().sum()就直接告诉了我们每列缺失值的数量
1表示横轴,方向从左到右;0表示纵轴,方向从上到下
如果你想知道哪些人经常使用Python这门语言,并且他们的其他信息是怎么样的,该怎么输出?
- import pandas as pd
- Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
- print(Now.loc[Now.Language=='Python'])
允许用户通过字符串表达式来筛选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)
- 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)
函数的传入参数根据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)
输出牛客网的Python用户的成就值都有多高
- import pandas as pd
- Now=pd.read_csv('Nowcoder.csv',sep=',',dtype=object)
- print(Now.loc[Now.Language=='Python','Achievement_value'])
假设你想查看该文件最后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))
表示将前n行数据显示出来,默认是显示前五行
表示将后n行数据显示出来,默认后五行
如果你想知道哪些人是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'"))
设置 Pandas 显示选项
- pd.set_option('display.width', 300) #设置显示一行的最大字符宽度为300
-
- pd.set_option('display.max_rows', None) #设置显示的最大行数为无限
-
- pd.set_option('display.max_columns', None) #设置显示的最大列数为无限
统计使用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"])])
牛客网刷题数量不低于500题的大佬,他们的等级和成就值是怎么样的
- import pandas as pd
- df=pd.read_csv('Nowcoder.csv',sep=',')
- print(df.loc[df.Num_of_exercise>500,['Level','Achievement_value']])
牛客网有哪些使用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)])
Nowcoder_ID:用户ID
Level:等级
Achievement_value:成就值
Num_of_exercise:刷题量
Graduate_year:毕业年份
Language:常用语言
Continuous_check_in_days:最近连续签到天数
Number_of_submissions:提交题目数量
Last_submission_time:最后一次提交题目日期
从这个csv文件中找到牛客网各种语言使用的用户分别有多少
- import pandas as pd
- df=pd.read_csv('Nowcoder.csv',sep=',')
- counts=df['Language'].value_counts()
- print(counts)
返回一个包含唯一值计数的Series,结果对象将按降序排列
用法: df.value_counts(normalize=False,sort=True,ascending=False, bins=None, dropna=True) normalize:如果为True,则返回的对象将包含唯一值的相对频率 sort:按值排序 ascending:升序排列 bins:不是对值进行计数,而是将它们分组到half-open箱中 dropna:不包括NaN计数
最长的用户已经连续签到了多久,最短的用户又连续签到了多久
- 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')
牛客网Python用户都平均提交了多少次代码
- import pandas as pd
- df=pd.read_csv('Nowcoder.csv',sep=',')
- print('{:.1f}'.format(df[df.Language=='Python']['Number_of_submissions'].mean()))
统计所有用户等级的中位数,但是为了去掉一些非常不活跃的账号,只统计刷题数量不低于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))
这个文件中记录了多少种常用语言,一并输出这些语言的名字
- import pandas as pd
- Nowcoder = pd.read_csv('Nowcoder.csv', sep=',')
-
- print(len(Nowcoder.Language.unique()))
- print(list(Nowcoder.Language.unique()))
返回去重后的不同值
直接放回不同值的个数
找到文件中等级的众数
- import pandas as pd
- df= pd.read_csv('Nowcoder.csv', sep=',')
-
- grade=df['Level'].mode().to_frame()
- print(grade)
依次输出用户成就值与最近连续签到天数的四分之一分位数以及刷题量与代码提交次数的四分之三分位数
- 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))
desc = c.describe(include='all') # include='all',代表对所有列进行统计,如果不加这个参数,则只对数值列进行统计
统计值变量说明
print(df.describe().loc[
"75%"
,[
"Num_of_exercise"
,
"Number_of_submissions"
]])
从这份文件中输出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()))
用户刷题量的方差以及提交代码次数的标准差
- 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))
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)
最高的正确率能有多少,只统计刷题数量大于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))
统计这些用户的名字长度
- import pandas as pd
- df=pd.read_csv('Nowcoder.csv',sep=',')
-
- print(df['Name'].str.len())
运营同学正在做用户调研,为了保证调研的可靠性,想要去掉那些信息不全的用户,即去掉有缺失数据的行,请去掉后输出全部数据
- 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)
找到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。
使用当前的最大年份填充缺失的毕业年份(“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)
使用指定的方法填充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。
系统错误将很多相同用户的数据输出了多条,导致文件中有很多重复的行,请先检查每一行是否重复,然后输出删除重复行后的全部数据
- 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())
返回 bool series 表示每行是否是重复的
返回删除重复项后的 dataframe
输出用户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']])
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’)
现有一个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))
将其转换成dataframe格式:
user_id:用户id
question_id:问题编号
result:运行结果
date:练习日期
请你统计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)
计算用户练习的平均次日留存率
- 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%
合并
DA1
中等16.12%
DA2
中等27.48%
DA3
较难13.85%
DA4
较难05.56%
DA5
中等09.14%
DA6
简单10.56%
DA7
简单20.05%
排序
DA1
简单10.36%
DA2
简单14.32%
函数
DA1
较难08.25%
DA2
较难06.28%
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。