大数据时代,数据的重要性不言而喻,掌握数据者得天下。很多同学可能对一堆数据不知如何进行处理分析得到有用的信息,本文主要基于anaconda 简单介绍 Numpy 模块的使用,重点演示 Pandas 的应用。
# 环境变量 for zsh,并为 anaconda 的pip命别名
export PATH=$PATH:/Applications/anaconda3/bin
alias cpip="/Applications/anaconda3/bin/pip"
source ~/.zhsrc
import numpy as np
# 一维数组
np.array([1,2,3])
# 二维数组
np.array([[1,2,3], [4,5,6]])
# 返回值优先级:str > float > int
import matplotlib.pylab as plt
# 返回一个数组,图片是三维数据
img_arr = plt.imread(‘./cat.jpg‘)
plt.imshow(img_arr)
plt.imshow(img_arr-100)
# 平均生成 num 个 start-stop数据
np.linspace(start, stop, num)
# start 默认是 0, step默认是 1, 给定 step 必须有start
np.arange([start,] stop[, step,], dtype=None)
# 不包含 10
np.arange(0, 10, 2)
# [low, high),high=None表示 [0-low), size=(1,2,3...)表示维度
np.random.randint(randint(low, high=None, size=None, dtype=‘l‘)
# 固定随机性,随机因子(系统时间)
np.random.seed(10)
np.random.randint(0,100, size=(4,5))
# 默认大小是 0-1
np.random.random(size=(4,5))
arr.shape # (4,5),返回的是数组的形状
arr.size # 元素个数
arr.dtype # (‘int64‘),数据类型
arr[1] # 第一个元素,索引从 0 开始
arr[2, 3] # 第二行第三列元素
arr[0:2] # 前两行
arr[:, 0:2] # , 左边是行,右边是列
arr[::-1] # 行倒序
arr[:, ::-1] # 列倒序
arr[:, ::-1, :]
arr.reshape()
# 容量必须刚刚好
arr.reshape((20,))
arr.reshape((1, 20))
arr.reshape(1, 20)
# 自动计算行数
arr.reshape((-1, 4))
# axis=0 表示作用于行(纵向拼接),axis=1作用于列(横向拼接)
np.concatenate((arr, arr), axis=0)
b = np.array([[1],[2],[3]])
a = np.array([1,2,3])
b-a
--> array([[ 0, -1, -2],
[ 1, 0, -1],
[ 2, 1, 0]])
arr.sum(axis=None) # 计算所有元素的和
arr.sum(axis=0) # 作用于列,数据并到一行。列的和
arr.sum(axis=1) # 作用于行,数据并到一列。行的和
arr.mean(axis=None/0/1) # 平均数
np.sqrt(arr) # 开方
np.prod(arr) # 所有元素相乘
np.min(arr) # 最小值
np.max(arr) # 最大值
np.std(arr) # 标准差
np.var(arr) # 方差
np.median(arr) # 中数
np.power(arr,2) # 幂运算
np.argmin(arr) # 最小值的下标
np.argmax(arr) # 最大值的下标
np.inf # 无穷大
np.exp(10) # 以e为底的指数,e**10
np.log(10) # 对数,e为底
# axis默认-1:表示按照上次的排序规则排序
# axis=0:表示按照列元素排序,1表示行元素排序
np.sort(arr, axis=-1, kind=‘quicksort‘, order=None)
# 列元素排序,列有序,arr被修改
arr.sort(axis=0)
# 列元素排序,列有序,不改变原数据
np.sort(arr, axis=0)
? SQL中的select是根据列的名称来选取;Pandas则更为灵活,不但可根据列名称选取,还可以根据列所在的position(数字,在第几行第几列,注意pandas行列的position是从0开始)选取。相关函数如下:
loc # 基于列label,可选取特定行(根据行index)
iloc # 基于行/列的position(默认的索引,整型)
at # 根据指定行index及列label,快速定位DataFrame的元素
iat # 与at类似,不同的是根据position来定位的
ix # 为loc与iloc的混合体,既支持label也支持position
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
Series(data=[1,2,3]) # 隐式索引
Series(data=[1,2,3], index=[a,b,c]) # 显示索引,提高可读性
Series(data=np.random.randint(0,100, size=(4)))
s = Series(data=[1,1,1,2,3,4,5,5,6])
# 去重
s.unique()
# NaN表示空,浮点类型
运算:只能针对索引对齐的数据运算,否则为NaN
# 空值检测
pd.isnull(arr) 或 s.isnull()
pd.notnull(arr) 或 s.notnull()
s[[True, True, False, False]]
s[s.notnull()] # 空值过滤
s = Series([1,2,3,4], index=[‘a‘, ‘b‘, ‘c‘, ‘d‘])
s.iloc[]
(推荐)s:iloc
中的中括号中必须放置隐式索引s = Series([1,2,3,4])
s[‘a‘:‘b‘] # [‘a‘, ‘b‘]
s.loc[‘a‘:‘b‘]
s[0:3] # [0, 3)
s.iloc[0:3]
s.index # 索引
s.values # 值
s.size # 长度
s.shape # (n,)
s.head(2)
s.tail(2)
s.unique()
# + - * /
# add() sub() mul() div()
# s1 + s2, 索引相同则相加,不同则保留切 +fill_value(float类型)
s1.add(s2,fill_value=0)
s1.mul(s2,fill_value=1)
# 使用ndarray创建DataFrame
df = DataFrame(data=np.random.randint(0,100, size=(3,3)), index=(‘a‘, ‘b‘, ‘c‘), columns=(‘1‘, ‘2‘, ‘3‘))
# 使用 dic 创建DataFrame
dic = {
‘张三‘:[11,22,33,44],
‘李四‘:[55,66,77,88]
}
df_score = DataFrame(data=dic,index=[‘语文‘,‘数学‘,‘英语‘,‘理综‘])
# 属性:shape、index、colums、values
df.shape / .index /.colums /.vlues
df=DataFrame(np.random.randint(0,100, size=(3,3)), index=(‘a‘,‘b‘,‘c‘), columns=(‘A‘,‘B‘,‘C‘))
df.A / df[‘A‘] # 取一列,即一个 Series对象
df[[‘A‘, ‘B‘]] # 取 A、B两列
df.loc[[‘a‘,‘b‘]] # 取 a、b 两行
df.iloc[[0, 1]] # 取 a、b 两行
df.loc[‘a‘, ‘3‘] # 取一个值,类似坐标取值
df.loc[[‘a‘, ‘c‘], ‘3‘] # 取多个值
df.loc[[‘a‘,‘c‘], [‘1‘, ‘2‘]]
# 切出前两行
df[‘a‘:‘b‘]
df[0:2]
# 切出前两列
df.loc[:, ‘A‘:‘B‘]
df.iloc[:, 0:2]
# 按照行列切片
df.loc[‘a‘:‘b‘, ‘1‘:‘2‘]
df.drop(1) # 默认删除行,即 axis=0
# tushare 股票数据获取模块
import tushare as ts
import pands as pd
# 获取 股票代码 600519 从2001.1.1的交易数据
df = ts.get_k_data(code=‘600519‘,start=‘2000-01-01‘)
# 把数据保存到本地 maotai.csv 中
df.to_csv(‘./maotai.csv‘)
# 使用 pandas 读取文件
df = pd.read_csv(‘./maotai.csv‘)
# 删除某一列
df.drop(labels=[‘Unnamed: 0‘], axis=1, inplace=True)
# 把字符串的日期转换为 Timestamp 类型
df = pd.read_csv(‘./maotai.csv‘,index_col=‘date‘,parse_dates=[‘date‘])
# 查看转换结果
df.index[0]
df.columns[0]
# (收盘-开盘)/开盘 > 0.03
df[(df.open - df.close)/df.open > 0.03]
#将行索引取出
df.loc[(df[‘close‘] - df[‘open‘]) / df[‘open‘] > 0.03].index
# (开盘-前日收盘)/前日收盘 < -0.02
df[(df.open - df.close.shift(1)) / df.close.shift(1) < -0.02].index
# 2010-2019, M:表示按月份取,A:表示按年取
new_df = df[‘2010-01-01‘:‘2019-09-03‘]
df_monthly = new_df.resample(‘M‘).first()
# 除了最后一条数据
df_yearly = new_df.resample(‘A‘).last()[:-1]
# 计算买入股票花费
cost = df_monthly[‘open‘].sum() * 100
recv = df_yearly[‘open‘].sum() * 1200
recv = 900 * new_df[-1:][‘open‘] + recv
recv - cost
numpy:没有异常值清洗
# 空值检测
df.isnull()
df.notnull()
# True 和 False 的判定
df.notnull().any(axis=1) # any表示or
df.notnull().all(axis=1) # and
# 去掉包含 NaN 的行,notnull + all, isnull + any
# 将 df.notnull().all(axis=1)作为原数据的索引,就可以将对应的空进行删除
df.loc[df.notnull().all(axis=1)] or
indexs = df.loc[df.isnull().any(axis=1)].index
df.drop[labels=indexs, axis=0]
# 将 df.isnull().any(axis=1)作为原数据的索引,就可以将对应的空进行保留
df.loc[df.isnull().any(axis=1)]
# 直接删除空行
df.dropna(axis=0)
# 替换,ffill/bfill:forward/backward fill。用上(下)一行进行覆盖空值行数据
df.fillna(value=‘目标值‘, method=‘ffill‘, axis=0)
df = pd.read_excel(‘文件路径.xlsx‘, sheet_name=‘xxx‘)
df = df.drop(labels=[‘none‘, ‘none1‘], axis=1 inplace=True)
# 清洗,删除空对应的行数据,方式一
df.dropna(axis=0)
# 方式二
df.loc[df.notnull().all(axis=1)]
# 清洗,替换空对应的行数据
df=df.fillna(method=‘ffill‘, axis=0).fillna(method=‘bfill‘, axis=0)
# 检测 df 列中是否还有空值
df.notnull().all(axis=0)
df.isnull().any(axis=0)
df1 = DataFrame(np.random.randint(1,100, size=(5,5)))
df2 = DataFrame(np.random.randint(1,100, size=(5,5)))
# 匹配级联
pd.concat((df1, df1), axis=0, join=‘outer‘)
# 不匹配级联,索引不同会有空值
pd.concat((df1, df2), axis=0, join=‘outer‘, sort=True)
# df1 数据一
dic1 = {
‘name‘:[‘henry‘,‘echo‘, ‘dean‘, ‘tom‘],
‘apartment‘:[‘tech‘,‘sale‘,‘hr‘, ‘xx‘],
}
df1 = DataFrame(dic1, index=[‘a‘, ‘b‘, ‘c‘])
# df2 数据二
dic2 = {
‘apartment‘:[‘tech‘,‘sale‘,‘hr‘, ‘acctounting‘],
‘supervisor‘:[‘diane‘, ‘oleg‘, ‘iris‘, ‘elaine‘]
}
df2 = DataFrame(dic2, index=[‘a‘, ‘b‘, ‘c‘])
df2
# 默认合并条件是相同的数据
pd.merge(left=df1, right=df2, on=‘apartment‘)
pd.merge(left=df1, right=df2, on=‘apartment‘, how=‘outer‘)
pd.merge(left=df1, right=df2, on=‘apartment‘, how=‘inner‘)
pd.merge(left=df1, right=df2, on=‘apartment‘, how=‘outer‘)
pd.merge(left=df1, right=df2, on=‘apartment‘, how=‘left‘)
pd.merge(left=df1, right=df2, on=‘apartment‘, how=‘right‘)
pd.merge(left=df1, right=df2, left_on=‘apartment‘,right_on=‘apart‘, how=‘right‘)
# 需求:
1. 导入文件,查看原始数据
2. 将人口数据和各州简称数据进行合并
3. 将合并的数据中重复的abbreviation列进行删除
4. 查看存在缺失数据的列
5. 找到有哪些state/region使得state的值为NaN,进行去重操作
6. 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
7. 合并各州面积数据areas
8. 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行,去除含有缺失数据的行
9. 找出2010年的全民人口数据
10.计算各州的人口密度 排序,并找出人口密度最高的五个州 df.sort_values()
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
peo = pd.read_csv(‘./data/state-population.csv‘)
area = pd.read_csv(‘./data/state-areas.csv‘)
abbr = pd.read_csv(‘./data/state-abbrevs.csv‘)
# 将人口数据和各州简称数据进行合并
# 将合并的数据中重复的abbreviation列进行删除
abbr_peo = pd.merge(abbr, peo, left_on=‘abbreviation‘, right_on=‘state/region‘, how=‘outer‘)
abbr_peo.drop(labels=‘abbreviation‘, axis=1,inplace=True)
abbr_peo.head(2)
# 查看存在缺失数据的列
abbr_peo.isnull().any(axis=0)
# 找到有哪些state/region使得state的值为NaN,进行去重操作
abbr_peo.loc[abbr_peo.state[abbr_peo.state.isnull()].index][‘state/region‘].unique()
# 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
indexs = abbr_peo[abbr_peo[‘state/region‘] == ‘PR‘].index
abbr_peo.loc[indexs, ‘state‘] = ‘PUERTO RICO‘
indexs = abbr_peo[abbr_peo[‘state/region‘] == ‘USA‘].index
abbr_peo.loc[indexs, ‘state‘] = ‘UNITED STATES‘
# 合并各州面积数据areas
abbr_peo_area = pd.merge(abbr_peo, area, how=‘outer‘)
abbr_peo_area.head(2)
# 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行,去除含有缺失数据的行
indexs = abbr_peo_area[abbr_peo_area[‘area (sq. mi)‘].isnull()].index
abbr_peo_area.drop(labels=indexs, axis=0, inplace=True)
# 找出2010年的全民人口数据
abbr_peo_area.query("ages==‘total‘and year==2010")
# 计算各州的人口密度 排序,并找出人口密度最高的五个州 df.sort_values()
abbr_peo_area.peo_dense = abbr_peo_area.population / abbr_peo_area[‘area (sq. mi)‘]
abbr_peo_area.head(2)
# 排序,并找出人口密度最高的五个州 df.sort_values()
abbr_peo_area.sort_values(by=‘peo_dense‘,axis=0, ascending=False).head(2)
df[0:2] = 6
df.iloc[5] = 6
# keep表示保留重复行的方式
df.drop_duplicates(keep=‘first/last‘/False)
# 指定单值替换,原数据为:64.0
df.replace(to_replace={64:‘xxx‘})
# 指定第三列的6替换
df.replace(to_replace={2:6}, value=‘six‘)
注意 :map()中不能使用sum之类的函数,for循环
dic = {
‘name‘:[‘周杰伦‘,‘张三‘,‘周杰伦‘],
‘salary‘:[15000,20000,15000]
}
df = DataFrame(data=dic)
df
name salary
0 周杰伦 15000
1 张三 20000
2 周杰伦 15000
# 映射关系表(字典)
dic = {
‘周杰伦‘:‘jay‘,
‘张三‘:‘tom‘
}
df[‘ename‘] = df.name.map(dic)
name salary ename
0 周杰伦 15000 jay
1 张三 20000 tom
2 周杰伦 15000 jay
# map(),用法一
df.ename = df.name.map(dic)
# 用法二,在增加一列时,需要使用 [‘列名‘],如果直接使用 .列名 会失败
df[‘neat_salary‘] = df.salary.map(lambda x: x - (x-3000)*0.5)
df
# 生成测试的随机数据
df = DataFrame(np.random.random(size=(1000, 3)), columns=[‘A‘, ‘B‘, ‘C‘])
# 计算C列的标准差,并获取不合格的索引
df.C.std()
indexs = df[df.C > 3*df.C.std()].index
indexs
# 删除
df.drop(labels=indexs, inplace=True, axis=0)
np.random.permutation(5)
df.take(indices=np.random.permutation(1000)).take(indices=np.random.permutation(3), axis=1).head()
df = DataFrame({‘item‘:[‘Apple‘,‘Banana‘,‘Orange‘,‘Banana‘,‘Orange‘,‘Apple‘],
‘price‘:[4,3,3,2.5,4,2],
‘color‘:[‘red‘,‘yellow‘,‘yellow‘,‘green‘,‘green‘,‘green‘],
‘weight‘:[12,20,50,30,20,44]})
df
item price color weight
0 Apple 4.0 red 12
1 Banana 3.0 yellow 20
2 Orange 3.0 yellow 50
3 Banana 2.5 green 30
4 Orange 4.0 green 20
5 Apple 2.0 green 44
df.groupby(by=‘item‘, axis=0)
df.groupby(by=‘item‘, axis=0).groups
# 执行结果
{‘Apple‘: Int64Index([0, 5], dtype=‘int64‘),
‘Banana‘: Int64Index([1, 3], dtype=‘int64‘),
‘Orange‘: Int64Index([2, 4], dtype=‘int64‘)}
mean_price = df.groupby(by=‘item‘, axis=0).price.mean()
df[‘mean_price‘] = df.item.map(mean_price)
df
color_price = df.groupby(by=‘color‘, axis=0).price.mean()
df[‘color_price‘] = df.color.map(color_price)
df
def my_mean(p):
sum = 0
for i in p:
sum += i
return sum/len(p)
aplly_my_mean = df.groupby(by=‘item‘, axis=0).price.apply(my_mean)
df[‘apply_my_mean‘] = df.item.map(aplly_my_mean)
df
# 采用 transform 方法,transform是映射后的数据
transform_my_mean = df.groupby(by=‘item‘, axis=0).price.transform(my_mean)
df[‘transform_my_mean‘] = transform_my_mean
df
#字段说明
cand_nm(候选人姓名),contbr_nm(捐赠者姓名), contbr_city,contbr_st, contbr_zip, contbr_employer, contbr_occupation(捐赠者的职业), contb_receipt_amt(捐赠金额), contb_receipt_dt(捐赠日期)
# 具体需求
1. 读取文件usa_election.txt
2. 查看文件样式及基本信息
3.【知识点】使用map函数+字典,新建一列各个候选人所在党派party
4. 使用np.unique()函数查看colums:party这一列中有哪些元素
5. 使用value_counts()函数,统计party列中各个元素出现次数,value_counts()是Series中的,无参,返回一个带有每个元素出现次数的Series
6.【知识点】使用groupby()函数,查看各个党派收到的政治献金总数contb_receipt_amt
7. 查看具体每天各个党派收到的政治献金总数contb_receipt_amt 。使用groupby([多个分组参数])
8. 将表中日期格式转换为‘yyyy-mm-dd‘。日期格式,通过函数加map方式进行转换
9. 得到每天各政党所收政治献金数目。 考察知识点:groupby(多个字段)
10.查看老兵(捐献者职业)DISABLED VETERAN主要支持谁 :查看老兵们捐赠给谁的钱最多
11.找出各个候选人的捐赠者中,捐赠金额最大的人的职业以及捐献额 .通过query("查询条件来查找捐献人职业")
# 统计出现次数
df[‘party‘].value_counts()
# 多次分组,必须注意 by=[],中的分组顺序。类似文件的树形结构
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1.读取文件usa_election.txt, 2.查看文件样式及基本信息
usa_election = pd.read_csv(‘./data/usa_election.txt‘)
usa_election.head(2)
# 3.【知识点】使用map函数+字典,新建一列各个候选人所在党派party
usa_election[‘parties‘] = usa_election[‘cand_nm‘].map(parties)
usa_election.head(2)
# 4.使用np.unique()函数查看colums:party这一列中有哪些元素
usa_election.parties.unique()
# 5.使用value_counts()函数,统计party列中各个元素出现次数,value_counts()是Series中的,无参,返回一个带有每个元素出现次数的Series
usa_election.parties.value_counts()
# 6.【知识点】使用groupby()函数,查看各个党派收到的政治献金总数contb_receipt_amt
usa_election.groupby(by=‘parties‘).contb_receipt_amt.sum()
# 7.查看具体每天各个党派收到的政治献金总数contb_receipt_amt 。使用groupby([多个分组参数])
usa_election.groupby(by=[‘contb_receipt_dt‘, ‘parties‘])[‘contb_receipt_amt‘].sum()
# 8.将表中日期格式转换为‘yyyy-mm-dd‘。日期格式,通过函数加map方式进行转换
date = usa_election.contb_receipt_dt
def transformDate(data):
for i in range(len(date)):
new_date = {}
day, month, year = date[i].split(‘-‘)
month = months[month]
return ‘-‘.join([‘20‘+year, str(month), day])
usa_election[‘contb_receipt_dt‘] = usa_election.contb_receipt_dt.map(transformDate)
usa_election.head(2)
# 9.得到每天各政党所收政治献金数目。 考察知识点:groupby(多个字段)
usa_election.groupby(by=[‘contb_receipt_dt‘, ‘parties‘]).contb_receipt_amt.sum()
# 10.查看老兵(捐献者职业)DISABLED VETERAN主要支持谁 :查看老兵们捐赠给谁的钱最多
df = usa_election[usa_election.contbr_occupation ==‘DISABLED VETERAN‘]
df.groupby(by=‘cand_nm‘).contb_receipt_amt.sum()
# 11.找出各个候选人的捐赠者中,捐赠金额最大的人的职业以及捐献额 .通过query("查询条件来查找捐献人职业")
max_amt = usa_election.groupby(by=[‘cand_nm‘])[‘contb_receipt_amt‘].max()
max_amt
for i in range(max_amt.size):
max_money = max_amt[i]
# for 循环中不显示执行结果,需要使用display或者print
display(usa_election.query(‘contb_receipt_amt == ‘+str(max_money))
原文:https://www.cnblogs.com/yx12138/p/11585833.html