jupyter基础知识详解

jupyter基本使用方法

pandas基础

增:df[‘sum’] = 100

删:

改:df[‘sum’] = df[‘sum’].apply(lambda x : x+2)

df.loc[查询条件,需要修改的列] = 100

查:

df[‘列名']    或df.列名
df['列名'][’行名']
df.loc[起始行:结束行,起始列:结束列]
df.loc[[需要选的行(1,3,5,7],[需要选的列(语文,数学)]]
df.groupby('列名').聚合函数(mean,std,median,max,sum)

import pandas as pd

s = pd.Series([‘张三’,‘李四’,‘王五’]) #Series自带索引值

s

s = pd.Series([‘张三’,‘李四’,‘王五’],index=[9527,9828,9529])

##Series对每一行加了索引名,使用index表示

s.index #求出索引值

list(s.index) #可以强转为列表

df_first = pd.DataFrame({‘数学’:[90,80,95],‘语文’:[88,86,90]})

#DataFrame自动生成表格

操作数据

数据加载

df = pd.read_csv(“score_pandas.csv”)

df

df = pd.read_csv(“score_pandas.csv”,index_col=0) #index_col指定索引列

df.index #取出索引列(姓名)中的所有索引

探索数据

df.info()
#Index: 4 entries 该数据集共有4条数据
#non-null 没有空值
#列后的数字如果小于index的数据总量,说明有缺失值
#性别     object说明该字段是字符串类型

Index: 4 entries, 张三 to 赵六
Data columns (total 7 columns):
数学    4 non-null int64
语文    4 non-null int64
英语    4 non-null int64
地理    4 non-null int64
音乐    4 non-null int64
体育    4 non-null int64
性别    4 non-null object
dtypes: int64(6), object(1)
memory usage: 256.0+ bytes
df.head(3)   #显示前三条记录
df.tail(3)   #显示后三条记录
df.describe() #基本的统计特征
#mean 平均值
#std 标准差(离中趋势,越大两极分化越严重)
# 1 2 3 4 5 
#      ^
#50% 中位数,去掉极端值以后群体水平的反映,3中位数
#25% 上四分位点 100个样本 索引25的位置是上四分位点
#75% 下四分位点 100个样本 索引75的位置是上四分位点

数据选择(指标统计)

#select * from score 选出所有的数据 #select * from score where 数学 > 90 #select * from score where 数学 > 90 and 体育 < 60 #select * from score order by 数学 #select * from score where 性别=‘女’ #select * from score where 性别 like ‘%女%’

df['数学']   #选择数学列

df['数学']['王五']     #选择出王五的数学成绩  

df['数学']['张三':'王五']    #将张三到王五的数学成绩选出
df.loc[:,'数学':'英语']     #将数学到英语之间的所有列选出

df.loc[:,'数学','英语']     #选出数学和英语列

df.loc['张三':'王五',['数学','英语']]     #将张三到王五的数学、英语成绩选出

df[df['数学']>90]

df.loc[df['数学']>90,['数学','英语']]

df[(df['数学']>90)&(df['体育']<60)]

df[df['性别'].str.contains('女')]     #将性别含有女字的选出
df.sort_values(by='数学',ascending=False)    #将数据按照数学字段降序排列,ascending=False 禁止升序

df.sum(axis=1)     #一般情况下axis=1按行求和,axis=0按列求和
df['总成绩'] = df.sum(axis=1)     #添加一个总成绩列
df

取出成绩前三名的学生名字:

result = df.sort_values(by='总成绩',ascending=False)

result.index

list(result.index)[:3]

result.columns #取出所有的列名

统计男生和女生的数学成绩的平均值:

df.loc[:,['性别','数学']].groupby('性别').mean()

数学成绩最高分的是谁:

df['数学'].idxmax()   #idxmax取最大值的索引
#'李四'

IMDB电影分析

导演电影部数排名前5位的导演,分别导演了哪些电影,总票房多少?

pandas方法:
df['Director'].value_counts().index[:5]
python方法:
用到counter函数,自动生成导演和电影部数的序列
result_dict = dict(counter(list(df['Director'])))
sorted(result_dict.items(),key=lambda x:x[1],reverse=True)
count_dict = {}
for d_str in df['Director']:
    if d_str in count_dict:
       count_dict[d_str] += 1
    else:
       count_dict[d_str] = 1
count_dict

#分别导演了什么电影,以及总票房
for d_name in df['Director'].value_counts().index[:5]:
    dirctor_info = df[df['Director'] == d_name]
    print(dirctor_info['Title'])
    print(dirctor_info['Revenue (Millions'].sum())

导演电影最多的导演是否平分平均分最高?

df.loc[:,['Director','Rating']].groupby('Director').mean()

科幻片票房最高的:

第一种方法:
df[df['Genre'].str.contains('Sci-Fi')]['Revenue (Millions)'].idxmax()
第二种方法:
df[df['Genre'].str.contains('Sci-Fi')].sort_values(by='Revenue (Millions)',ascending=False)

哪种类型的影片数量最多:

g_dict = {}
for g_str in df['Genre']:
    g_list = g_str.split(",")
    for g_name in g_list:
       if g_name in g_dict:
          g_dict[g_name] += 1
       else:
          g_dict[g_name] = 1
g_dict

英雄联盟英雄数据分析

加载数据及探索

import pandas as pd
df_lol = pd.read_excel('lol.xlsx',index_col=0)
df_lol.info()

数据清洗转换

#清洗生命值
import re
def change_life_value(x:str):
    life_list = re.findall('\d+',x)
    full_level_life = 0
    if len(life_list) >= 2:
        full_level_life = int(life_list[0]) + int(life_list[1])*17
    else:
        full_level_life = int(life_list[0])
    return full_level_life
df_lol['满级生命值'] = df['生命值'].apply(lambda x : change_life_value(x))
df_lol['满级生命值'].idxmax()
df_lol[61:63]
#清洗攻击速度
import re
def change_attack_speed(x:str):
    if type(x) != str:
        return x
    attack_list = re.findall('\d+\.?\d+',x)
    attack_full_value = 0
    if len(attack_list) >= 2:
        attack_full_value = float(attack_list[0]) * (1 + float(attack_list[1])/100) ** 17
    else:
        attack_full_value = float(attack_list[0])
    return attack_full_value


df_lol['攻击速度'].apply(lambda x:change_attack_speed(x))

电信数据统计

df_5g = pd.read_excel("5G套餐抽样.xlsx",sheet_name="Sheet2") #不指定sheet_name默认读取第一个tab页
df_5g.loc[:,['销售品名称','主副卡标识','主叫时长']].groupby(['销售品名称','主副卡标识']).mean()
df_5g.loc[:,['销售品名称','主副卡标识']].groupby(['销售品名称','主副卡标识']).size() #统计个数
result_5g = df_5g.loc[:,['销售品名称','主副卡标识','主叫时长']].groupby(['销售品名称','主副卡标识']).mean()
result_5g.index #这里生成的索引结构时多层索引
result_5g.to_dict() #遍历数据需要使用
result_5g['主叫时长'][('十全十美(5G版)169元套餐202007', '副卡2')]
#result_5g.query("销售品名称 == '十全十美(5G版)169元套餐202007'")
result_5g.query("销售品名称 == '十全十美(5G版)169元套餐202007' & 主副卡标识 == '主卡1' ") #复合条件查询
result_5g.query("销售品名称 == '十全十美(5G版)169元套餐202007' & 主副卡标识 == '主卡1' ").values
result_5g.query("销售品名称 == '十全十美(5G版)169元套餐202007' & 主副卡标识 == '主卡1' ")['主叫时长']
import pandas as pd
df = pd.read_excel("5G套餐抽样.xlsx")
df.info()
df['主副卡标识'] = df['主副卡标识'].apply(lambda x:x[0])
result = df.loc[:,['销售品名称','用户名','主副卡标识']].groupby(['销售品名称','用户名','主副卡标识']).size()
result_5g = pd.DataFrame(['count':result.values],index = result.index)
result_5g
result_sale_name = result_5g.query('销售品名称 == "十全十美(5G版)
result_sale_name
result_sale_name.index.get_level_values('主副卡标识')
result_sale_name[result_sale_name.index.get_level_values('主副卡标识')=='副']
result_sale_name[result_sale_name.index.get_level_values
result_5g.query("用户名 == '张华'")
df[df['用户名'] == '张华']
for sale_name in df['销售品名称'].unique():
    pass

网游运营分析:

数据加载与探索:
import pandas as pa
df = pd.read_excel("0922 数据分析题目",sheet_name="题目用数据")
df.info()
df.columns
df.loc[:,['名字','支付金额/¥']].groupby('名字').sum()
result = df.loc[:,['名字','支付金额/¥']].groupby('名字').sum()
big_r = result[result['支付金额/¥'] > 6000].index
middle_r = result[(result['支付金额/¥'] >= 1000) & (result['支付金额/¥'] <= 6000)].index
small_r = result.loc[result['支付金额/¥'] < 100,['支付金额/¥']].index
df['level'] = 'other'
for l_name in big_r:
    df.loc[df['名字'] == l_name,'level'] = 'big_r'
df[df['level'] == 'big_r']['名字'].unique()
for l_name in middle_r:
    df.loc[df['名字'] == l_name,'level'] = 'middle_r'
    
for l_name in small_r:
    df.loc[df['名字'] == l_name,'level'] = 'small_r'
df.loc[:,['周','支付金额/¥']].groupby('周').sum().sort_values(by='支付金额/¥',ascending=False)
df.loc[:,['level','周','支付金额/¥']].groupby(['周','level']).sum()
result_level = df.loc[:,['level','周','支付金额/¥']].groupby(['周','level']).sum()
result_level.query("level == 'big_r'")
result_level.to_dict()
def display_level_info(level_name:str):
    """
    按照传入的充值等级进行显示
    """
    #result_level = df.loc[:,['level','周','支付金额/¥']].groupby(['周','level']).sum()
    for i in range(15):
        time_str = "第" + str(i+1) + "周"
        print(time_str + ":" + str(result_level['支付金额/¥'][(time_str,level_name)]))
        

display_level_info("middle_r")
df.loc[df['level'] == 'big_r',['周','level','礼包ID','支付金额/¥']].groupby(['周','level','礼包ID']).sum()

拼接多个数据表(具有相同的格式)

#将data目录下的csv文件拼接在一起
import pandas as pd
import os
df_concat = pd.DataFrame({})
for file_name in os.listdir("./data"):
    full_path = "./data/"+file_name
    df_temp = pd.read_csv(full_path)
    df_concat = pd.concat((df_concat,df_temp))
​
df_concat.to_csv("./data/result_concat.csv")

#具有相同后缀变化的excel拼接在一起
df_excel = pd.DataFrame({})
for i in range(2):
    tab_name = "题目用数据"+str(i+1)
    df_temp = pd.read_excel("数据分析题目.xlsx",sheet_name=tab_name)
    df_excel = pd.concat((df_excel,df_temp))
​
进行两表合并查询

df_gift_info = pd.read_excel("数据分析题目.xlsx",sheet_name="礼包id对应的礼包名称")

df_merge = pd.merge(df,df_gift_info,on=['礼包ID'])

df_merge.head(3)
df_merge.loc[df_merge['level'] == 'big_r',['周','level','礼包名称','支付金额/¥']].groupby(['周','level','礼包名称']).sum()

主副卡分析:

import pandas as pd
df = pd.read_excel('5g套餐抽样.xlsx')

len(df['用户名'].unique())   #1157

df['主副卡标识'] = df['主副卡标识'].apply(lambda x:x[0])   #改为主或者副

#size统计NaN数据,count不统计
result = df.loc[:,['销售品名称','用户名','主副卡标识']].groupby(['销售品名称','用户名','主副卡标识']).size()    #size统计有多少主卡副卡
result

df_5g = pd.DataFrame({'count':result.values},index=result.index)
df_5g           #转为DataFrame格式

df_5g_129 = df_5g.query('销售品名称 == "十全十美(5G版)129元套餐202007"')
df_5g_129

df_5g_129.index.get_level_values('主副卡标识')   #get_level_values方法取值

result_main = df_5g_129.index.get_level_values('用户名').value_counts()   #value_counts统计个数

result_main[result_main == 2] #有主卡,并且办理了副卡的用户名必然出现两次,103是主副卡都有的人

df_5g_129[df_5g_129.index.get_level_values('主副卡标识') == '主'] # 148 - 103 = 45 只有45人有主卡没有副卡,148所有主卡用户

df_5g_129[df_5g_129.index.get_level_values('主副卡标识') == '副'] #129 - 103 = 26,只有26人只有副卡

all_users = set(df_5g_129.index.get_level_values('用户名'))
all_users

df_temp = df_5g_129[df_5g_129.index.get_level_values('主副卡标识') == '主'] #选出所有主卡用户
main_users = set(df_temp.index.get_level_values('用户名'))
main_users

len(all_users - main_users)

传染病数据分析:

import pandas as pd
df = pd.read_csv ("question_input (Python) - 副本.csv",encoding='gbk')
#读取不出来就encoding

df.info()

df.columns

df.head(10)

df_shanghai = df[df['province'] == '上海市'].copy()

df_shanghai['increase_confirm_nums'].values.cumsum()

df_shanghai['cumsum'] =df_shanghai['increase_confirm_nums'].values.cumsum()
#values.cumsum求累加和
df_shanghai.head(5)

计算现存确诊人数


cured_cumsum = df_shanghai['increase_cured_nums'].values.cumsum()

dead_cumsum = df_shanghai['increase_dead_nums'].values.cumsum()

df_shanghai['stock'] = df_shanghai['cumsum'].values - (cured_cumsum + dead_cumsum)

df_shanghai.head(5)

confirm_nums = df_shanghai['increase_confirm_nums'].values
#values取这一列的值

confirm_nums

cumsum_nums = df_shanghai['cumsum'].values

cumsum_nums

confirm_nums[1:]

cumsum_nums[:-1]

result = confirm_nums[1:]/cumsum_nums[:-1]

result

s_result = pd.Series(result) #变成Series格式

s_result

z_result = s_result.apply(lambda x : '%0.2f' %x)
#将结果保留小数点后两位

z_result

距离该城市首次出现病例的日期

from datetime import datetime
df['biz_date'].apply(lambda x : datetime.strptime(x,'%m/%d/%Y'))
#格式化时间日期

s_date = df['biz_date'].apply(lambda x : datetime.strptime(x,'%m/%d/%Y'))

begin = s_date[0]  #记住取begin的方法
s_date.apply(lambda x : (x-begin).days) #记住(x-begin).days这个用法

按省份直辖市统计

result = df.groupby('province')  #直接groupby即可

result
#生成的对象需要进行遍历才可以

for r in result:
    print(r[0],r[1])


万水千山总是情,点个关注行不行。100多篇博客,总有一篇可以帮助您。

你可能感兴趣的:(数据分析,python,jupyter,pandas)