jupyter基本使用方法
pandas基础
增:df[‘sum’] = 100
删:
改:df[‘sum’] = df[‘sum’].apply(lambda x : x+2)
[查询条件,需要修改的列] = 100
查:
df[‘列名'] 或df.列名
df['列名'][’行名']
[起始行:结束行,起始列:结束列]
[[需要选的行(1,3,5,7],[需要选的列(语文,数学)]]
('列名').聚合函数(mean,std,median,max,sum)
import pandas as pd
s = ([‘张三’,‘李四’,‘王五’]) #Series自带索引值
s
s = ([‘张三’,‘李四’,‘王五’],index=[9527,9828,9529])
##Series对每一行加了索引名,使用index表示
#求出索引值
list() #可以强转为列表
df_first = ({‘数学’:[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指定索引列
#取出索引列(姓名)中的所有索引
探索数据
()
#Index: 4 entries 该数据集共有4条数据
#non-null 没有空值
#列后的数字如果小于index的数据总量,说明有缺失值
#性别 object说明该字段是字符串类型
<class ''>
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
(3) #显示前三条记录
(3) #显示后三条记录
() #基本的统计特征
#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[df['数学']>90]
[df['数学']>90,['数学','英语']]
df[(df['数学']>90)&(df['体育']<60)]
df[df['性别'].('女')] #将性别含有女字的选出
df.sort_values(by='数学',ascending=False) #将数据按照数学字段降序排列,ascending=False 禁止升序
(axis=1) #一般情况下axis=1按行求和,axis=0按列求和
df['总成绩'] = (axis=1) #添加一个总成绩列
df
取出成绩前三名的学生名字:
result = df.sort_values(by='总成绩',ascending=False)
list()[:3]
#取出所有的列名
统计男生和女生的数学成绩的平均值:
[:,['性别','数学']].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())
导演电影最多的导演是否平分平均分最高?
[:,['Director','Rating']].groupby('Director').mean()
科幻片票房最高的:
第一种方法:
df[df['Genre'].('Sci-Fi')]['Revenue (Millions)'].idxmax()
第二种方法:
df[df['Genre'].('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('',index_col=0)
df_lol.info()
数据清洗转换
#清洗生命值
import re
def change_life_value(x:str):
life_list = ('\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 = ('\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['主副卡标识'] = df['主副卡标识'].apply(lambda x:x[0])
result = [:,['销售品名称','用户名','主副卡标识']].groupby(['销售品名称','用户名','主副卡标识']).size()
result_5g = (['count':],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="题目用数据")
()
[:,['名字','支付金额/¥']].groupby('名字').sum()
result = [:,['名字','支付金额/¥']].groupby('名字').sum()
big_r = result[result['支付金额/¥'] > 6000].index
middle_r = result[(result['支付金额/¥'] >= 1000) & (result['支付金额/¥'] <= 6000)].index
small_r = [result['支付金额/¥'] < 100,['支付金额/¥']].index
df['level'] = 'other'
for l_name in big_r:
[df['名字'] == l_name,'level'] = 'big_r'
df[df['level'] == 'big_r']['名字'].unique()
for l_name in middle_r:
[df['名字'] == l_name,'level'] = 'middle_r'
for l_name in small_r:
[df['名字'] == l_name,'level'] = 'small_r'
[:,['周','支付金额/¥']].groupby('周').sum().sort_values(by='支付金额/¥',ascending=False)
[:,['level','周','支付金额/¥']].groupby(['周','level']).sum()
result_level = [:,['level','周','支付金额/¥']].groupby(['周','level']).sum()
result_level.query("level == 'big_r'")
result_level.to_dict()
def display_level_info(level_name:str):
"""
按照传入的充值等级进行显示
"""
#result_level = [:,['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['level'] == 'big_r',['周','level','礼包ID','支付金额/¥']].groupby(['周','level','礼包ID']).sum()
拼接多个数据表(具有相同的格式)
#将data目录下的csv文件拼接在一起
import pandas as pd
import os
df_concat = ({})
for file_name in ("./data"):
full_path = "./data/"+file_name
df_temp = pd.read_csv(full_path)
df_concat = ((df_concat,df_temp))
df_concat.to_csv("./data/result_concat.csv")
#具有相同后缀变化的excel拼接在一起
df_excel = ({})
for i in range(2):
tab_name = "题目用数据"+str(i+1)
df_temp = pd.read_excel("数据分析题目.xlsx",sheet_name=tab_name)
df_excel = ((df_excel,df_temp))
进行两表合并查询
df_gift_info = pd.read_excel("数据分析题目.xlsx",sheet_name="礼包id对应的礼包名称")
df_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 = [:,['销售品名称','用户名','主副卡标识']].groupby(['销售品名称','用户名','主副卡标识']).size() #size统计有多少主卡副卡
result
df_5g = ({'count':},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
()
(10)
df_shanghai = df[df['province'] == '上海市'].copy()
df_shanghai['increase_confirm_nums'].()
df_shanghai['cumsum'] =df_shanghai['increase_confirm_nums'].()
#求累加和
df_shanghai.head(5)
计算现存确诊人数
cured_cumsum = df_shanghai['increase_cured_nums'].()
dead_cumsum = df_shanghai['increase_dead_nums'].()
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 = (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 : (x,'%m/%d/%Y'))
#格式化时间日期
s_date = df['biz_date'].apply(lambda x : (x,'%m/%d/%Y'))
begin = s_date[0] #记住取begin的方法
s_date.apply(lambda x : (x-begin).days) #记住(x-begin).days这个用法
按省份直辖市统计
result = ('province') #直接groupby即可
result
#生成的对象需要进行遍历才可以
for r in result:
print(r[0],r[1])
万水千山总是情,点个关注行不行。100多篇博客,总有一篇可以帮助您。