数据分析总结

导包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 自动适应布局
plt.rcParams.update({
    
    'figure.autolayout': True})
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False

读写

data = pd.read_csv('filename.csv')
data.to_csv('filename.csv')

查看信息

# 查看前十行
data.head(10)
# 数据集中有多少数据记录?
data.shape
# 数据集中有列
data.shape[1]
# 数据集中的列数是多少?
data.columns.size
# 打印所有列的名称
data.columns
# 数据集的索引的索引对象?
data.index
# 查看数据的详细信息
data.info()
# 查看数据集的行列索引,数据类型等信息
data.dtypes
# 数据描述
data.describe()

对列操作

# 只取Goals一列
data.Goals
# 将年份改为索引
data = data.set_index('year')
# 只输出“a”列
data['a']
# 只查看“Team”, “Yellow Cards” 和“Red Cards” 这几列数据
data[['Team','Yellow Cards','Red Cards']]

loc:通过行标签索引数据

iloc:通过行号索引行数据

ix:通过行标签或行号索引数据(基于 loc 和 iloc 的混合)

# 选择前7列数据
data.iloc[:, :7]
# 选择除最后3列之外的所有列
data.iloc[:,:-3]
# 重置index
data = data.reset_index()
# 重新给列命名{'a':'aa', 'b':'bb', 'c':'cc'}
data = data.rename(columns={
    
    'a':'aa', 'b':'bb', 'c':'cc'})
# 组织列的顺序 调整后的顺序:'title', 'year', 'director', 'duration', 'director_facebook_likes','imdb_score', 'actor_1_name', 'actor_2_name', 'actor_3_name', 'actor_1_facebook_likes', 'actor_2_facebook_likes', 'actor_3_facebook_likes', 'gross', 'genres', 'num_voted_users', 'cast_total_facebook_likes', 'facenumber_in_poster', 'num_user_for_reviews', 'language', 'country','budget', 'movie_facebook_likes'
li = ['title', 'year', 'director', 'duration', 'director_facebook_likes','imdb_score', 'actor_1_name', 'actor_2_name', 'actor_3_name', 'actor_1_facebook_likes', 'actor_2_facebook_likes', 'actor_3_facebook_likes', 'gross', 'genres', 'num_voted_users', 'cast_total_facebook_likes', 'facenumber_in_poster', 'num_user_for_reviews', 'language', 'country','budget', 'movie_facebook_likes']
data = data[li]
# 最大值的索引值
data.idxmax(0)

str操作,类型转换

# 首字母大写
data['a'] = data['a'].str.capitalize()
# 选择命名以字母G开头的团队
data[euro12['Team'].str.startswith('G')]
# 筛选a中大于6的
data[data.a>6]
# 新建一列month,用于存放入职月份   提示:从'HireDate'列中提取月份
data['month'] = data['HireDate'].str.split('/').str[0]
# 将a列数据转换为float
data['a'].astype(float)
# 将a列转化为category类型
a_category = data['a'].astype('category')
# 改变类别标签
data['grade'].cat.categories = ['very good', 'good', 'very bad']

# 见:shiyan04综合实验/巴尔的摩公务员工资分析.ipynb
# 计算年薪平均值和职位个数
per_salary = salary['AnnualSalary'].sum() / salary['AgencyID'].count()
print ('年薪平均值:%i个' % per_salary)
salary['JobTitle'] = salary['JobTitle'].astype('category')
post_count = len(salary['JobTitle'].cat.categories)
print('职位个数:%i个' % post_count)
# 日期类型转换
def splitSaletime(timeColSer):
    str1 = timeColSer.split(' ')
    return str1[0]

data['销售时间'] = data['销售时间'].map(splitSaletime)

data.loc[:,'销售时间']=pd.to_datetime(data.loc[:,'销售时间'], format='%Y-%m-%d', errors='coerce')
data.dtypes

# 转换日期过程中不符合日期格式的数值会被转换为空值,因此,需要再次检查是否生成新的空值,若有,请删除。
data=data.dropna(subset=['销售时间','社保卡号'],how='any')
# 将 Year 的数据类型转换为 datetime64
pd.to_datatime(data.Year, format='%Y')

删除del,检测缺失值

# 删除'Unnamed: 0' 和'Id'这两列
del data['Unnamed: 0']
del data['Id']
# 缺失值检测,并删除缺失值
data.dropna(axis=0, how='any', inplace=True)
# 删除含缺失值的不需要的字段
data.drop('a', axis=1, inplace=True)
# 异常值处理:判断“销售数量”是否存在小于0的值,若有,请删除负值所对应的记录。
data.describe()

query1 = data['销售数量']>0
data = data.loc[query1,:]
data.shape
# 对应每一个location,一共有多少数据值缺失
# 对应每一个location,一共有多少完整的数据值
data.isnull().sum()
data.shape[1] - data.isnull().sum()

nunique(),unique()

# nunique() 得到的是个数字,unique()得到的是个numpy.ndarray
# 数据集中有多少个不同的a   
len(data['a'].unique())
data['a'].nunique()
# 有重复的日期吗
data.Data.is_unique()

min(),max(),median()

# 哪个名字是出现最多的/最少/中位数?
names[names.Count == names.Count.max()]
names[names['Count'] == names['Count'].max()]

# 最少有多少个
len(names[names.Count == names.Count.min()]) 

names[names.Count == names.Count.median()]
#数据集中最早的日期和最晚的日期相差多少天?
(apple.index.max() - apple.index.min()).days

resample重采样

#找到每个月的最后一个交易日(business day)
apple_month = apple.resample('BM').mean()

数据合并

#将 data1 和 data2 两个数据框按照行的维度进行合并,命名为 all_data
all_data = pd.concat([data1,data2],axis=0)
#将 data1 和 data2 两个数据框按照列的维度进行合并,命名为 all_data_col
all_data_col = pd.concat([data1,data2],axis=1)
#按照 subject_id 的值对 all_data 和 data3 作合并
pd.merge(all_data,data3,on='subject_id')
#对 data1 和 data2 按照 subject_id 作内连接
pd.merge(data1,data2,on='subject_id',how='inner')
#找到 data1 和 data2 合并之后的所有匹配结果
pd.merge(data1,data2,on='subject_id',how='outer')

value_counts(),groupby(),apply(),map(),agg(),sort_values(),lambda()

# value_counts  哪些……最多
# 在a列中,哪些商品订购最多?
data['a'].value_counts().head()
# sort_values  排序  ascending=False降序
data.sort_values(['a', 'b'], ascending=[False, False])
# 推荐imdb_score得分最高的5部电影
data_r = movies.sort_values(['imdb_score'], ascending=False).head(5)
data_r[['title', 'imdb_score']]
# 去除 AnnualSalary,GrossPay 两列中的 $号,并将这两列数据类型转为 float
def f(x):
    return x.split('$')[1]
data['AnnualSalary'] = data['AnnualSalary'].map(f).astype(float)
data['GrossPay'] = data['GrossPay'].map(f).astype(float)
# groupby
# 探索每种职业的平均年龄是多少?
data['age'].groupby(data['occupation']).mean()
data.groupby('occupation')['age'].mean()
data.groupby('occupation').age.mean()

# 职业和性别的进行组合,计算每种组合的平均年龄
data.groupby(['occupation','gender']).size()

# 每种职业中的男女占比
data.groupby(['occupation','gender']).size() / data.groupby(['occupation']).size() * 100
# apply    groupby    sort_values
# 探索每种职业男性的比例,并将其从最大到最小排序
def gender_choose(x):
    if x=='M':
        return 1
    else:
        return 0
    
users['gender_num'] = users['gender'].apply(gender_choose)
grouped = users['gender_num'].groupby(users['occupation']).sum() / users['occupation'].value_counts() * 100
grouped.sort_values(ascending = False)
# groupby  agg
# 计算每个职业中的最小年龄和最大年龄
users['age'].groupby(users['occupation']).agg(['min', 'max'])
# 每年最高票房的电影名、最低票房电影名和它们的票房差
movies[['gross', 'title']].groupby('year').agg(['min', 'max'])
# lambda map
majority = lambda x:["合法" if x>17 else "不合法"]
df['legal_drinker'] = df['age'].map(majority)

猜你喜欢

转载自blog.csdn.net/qq_41754907/article/details/107150786