Pandas数据分析常用小技巧
数据分析中pandas的小技巧,快速进行数据预处理,欢迎点赞收藏,持续更新,作者:北山啦
文章目录
- Pandas数据分析常用小技巧
- Pandas小技巧
- pandas生成数据
- 导入数据
- 导出数据
- 查看数据
- 数据选择
- 数据处理
- 数据分组
- 数据合并
- 数据替换--map映射
- 数据清洗--replace和正则
- 数据透视表分析--melt函数
- 将分类中出现次数较少的值归为others
- Python合并多个EXCEL工作表
- pandas中Series和Dataframe数据类型互转
- 相同字段合并
- Python小技巧
- 简单的表达式
- 列表推导式
- 交换变量
- 检查对象使用内存情况
- 合并字典
- 字符串分割成列表
- 字符串列表创建字符串
- Python查看图片
- itertools模块combinations
- itertools中reduce
- 字典.get()方法
- 解压zip压缩包到指定文件路径
- 综合案例
- 演员关系分析
Pandas小技巧
代码语言:javascript复制import pandas as pd
pandas生成数据
代码语言:javascript复制d = {"sex": ["male", "female", "male", "female"],
"color": ["red", "green", "blue", "yellow"],
"age": [12, 56, 21, 31]}
df = pd.DataFrame(d)
df
sex | color | age | |
---|---|---|---|
0 | male | red | 12 |
1 | female | green | 56 |
2 | male | blue | 21 |
3 | female | yellow | 31 |
导入数据
代码语言:javascript复制pd.DataFrame() # 自己创建数据框,用于练习
pd.read_csv(filename) # 从CSV⽂件导⼊数据
pd.read_table(filename) # 从限定分隔符的⽂本⽂件导⼊数据
pd.read_excel(filename) # 从Excel⽂件导⼊数据
pd.read_sql(query,connection_object) # 从SQL表/库导⼊数据
pd.read_json(json_string) # 从JSON格式的字符串导⼊数据
pd.read_html(url) # 解析URL、字符串或者HTML⽂件,抽取其中的tables表格
导出数据
代码语言:javascript复制df.to_csv(filename) #导出数据到CSV⽂件
df.to_excel(filename) #导出数据到Excel⽂件
df.to_sql(table_name,connection_object) #导出数据到SQL表
df.to_json(filename) #以Json格式导出数据到⽂本⽂件
writer=pd.ExcelWriter('test.xlsx',index=False)
df1.to_excel(writer,sheet_name='单位')和writer.save(),将多个数据帧写⼊同⼀个⼯作簿的多个sheet(⼯作表)
查看数据
代码语言:javascript复制df.head(n) # 查看DataFrame对象的前n⾏
df.tail(n) # 查看DataFrame对象的最后n⾏
df.shape() # 查看⾏数和列数
df.info() # 查看索引、数据类型和内存信息
df.columns() # 查看字段(⾸⾏)名称
df.describe() # 查看数值型列的汇总统计
s.value_counts(dropna=False) # 查看Series对象的唯⼀值和计数
df.apply(pd.Series.value_counts) # 查看DataFrame对象中每⼀列的唯⼀值和计数
df.isnull().any() # 查看是否有缺失值
df[df[column_name].duplicated()] # 查看column_name字段数据重复的数据信息
df[df[column_name].duplicated()].count() # 查看column_name字段数据重复的个数
数据选择
代码语言:javascript复制df[col] # 根据列名,并以Series的形式返回列
df[[col1,col2]] # 以DataFrame形式返回多列
s.iloc[0] # 按位置选取数据
s.loc['index_one'] # 按索引选取数据
df.iloc[0,:] # 返回第⼀⾏
df.iloc[0,0] # 返回第⼀列的第⼀个元素
df.loc[0,:] # 返回第⼀⾏(索引为默认的数字时,⽤法同df.iloc),但需要注意的是loc是按索引,iloc参数只接受数字参数
df.ix[[:5],["col1","col2"]] # 返回字段为col1和col2的前5条数据,可以理解为loc和
iloc的结合体。
df.at[5,"col1"] # 选择索引名称为5,字段名称为col1的数据
df.iat[5,0] # 选择索引排序为5,字段排序为0的数据
数据处理
代码语言:javascript复制df.columns= ['a','b','c'] # 重命名列名(需要将所有列名列出,否则会报错)
pd.isnull() # 检查DataFrame对象中的空值,并返回⼀个Boolean数组
pd.notnull() # 检查DataFrame对象中的⾮空值,并返回⼀个Boolean数组
df.dropna() # 删除所有包含空值的⾏
df.dropna(axis=1) # 删除所有包含空值的列
df.dropna(axis=1,thresh=n) # 删除所有⼩于n个⾮空值的⾏
df.fillna(value=x) # ⽤x替换DataFrame对象中所有的空值,⽀持
df[column_name].fillna(x)
s.astype(float) # 将Series中的数据类型更改为float类型
s.replace(1,'one') # ⽤‘one’代替所有等于1的值
s.replace([1,3],['one','three']) # ⽤'one'代替1,⽤'three'代替3
df.rename(columns=lambdax:x 1) # 批量更改列名
df.rename(columns={'old_name':'new_ name'}) # 选择性更改列名
df.set_index('column_one') # 将某个字段设为索引,可接受列表参数,即设置多个索引
df.reset_index("col1") # 将索引设置为col1字段,并将索引新设置为0,1,2...
df.rename(index=lambdax:x 1) # 批量重命名索引
数据分组
代码语言:javascript复制df.sort_index().loc[:5] # 对前5条数据进⾏索引排序
df.sort_values(col1) # 按照列col1排序数据,默认升序排列
df.sort_values(col2,ascending=False) # 按照列col1降序排列数据
df.sort_values([col1,col2],ascending=[True,False]) # 先按列col1升序排列,后按col2降序排列数据
df.groupby(col) # 返回⼀个按列col进⾏分组的Groupby对象
df.groupby([col1,col2]) # 返回⼀个按多列进⾏分组的Groupby对象
df.groupby(col1)[col2].agg(mean) # 返回按列col1进⾏分组后,列col2的均值,agg可以接受列表参数,agg([len,np.mean])
df.pivot_table(index=col1,values=[col2,col3],aggfunc={col2:max,col3:[ma,min]}) # 创建⼀个按列col1进⾏分组,计算col2的最⼤值和col3的最⼤值、最⼩值的数据透视表
df.groupby(col1).agg(np.mean) # 返回按列col1分组的所有列的均值,⽀持
df.groupby(col1).col2.agg(['min','max'])
data.apply(np.mean) # 对DataFrame中的每⼀列应⽤函数np.mean
data.apply(np.max,axis=1) # 对DataFrame中的每⼀⾏应⽤函数np.max
df.groupby(col1).col2.transform("sum") # 通常与groupby连⽤,避免索引更改
数据合并
代码语言:javascript复制df1.append(df2) # 将df2中的⾏添加到df1的尾部
df.concat([df1,df2],axis=1,join='inner') # 将df2中的列添加到df1的尾部,值为空的对应⾏与对应列都不要
df1.join(df2.set_index(col1),on=col1,how='inner') # 对df1的列和df2的列执⾏SQL形式的join,默认按照索引来进⾏合并,如果df1和df2有共同字段时,会报错,可通过设置lsuffix,rsuffix来进⾏解决,如果需要按照共同列进⾏合并,就要⽤到set_index(col1)
pd.merge(df1,df2,on='col1',how='outer') # 对df1和df2合并,按照col1,⽅式为outer
pd.merge(df1,df2,left_index=True,right_index=True,how='outer') #与 df1.join(df2, how='outer')效果相同
数据替换–map映射
map() 会根据提供的函数对指定序列做映射。
map(function, iterable, …)
- function – 函数
- iterable – 一个或多个序列
d = {"male": 1, "female": 0}
df["gender"] = df["sex"].map(d)
df
sex | color | age | gender | |
---|---|---|---|---|
0 | male | red | 12 | 1 |
1 | female | green | 56 | 0 |
2 | male | blue | 21 | 1 |
3 | female | yellow | 31 | 0 |
数据清洗–replace和正则
分享pandas数据清洗技巧,在某列山使用replace和正则快速完成值的清洗
代码语言:javascript复制d = {"customer": ["A", "B", "C", "D"],
"sales": [1000, "950.5RMB", "$400", "$1250.75"]}
df = pd.DataFrame(d)
df
customer | sales | |
---|---|---|
0 | A | 1000 |
1 | B | 950.5RMB |
2 | C | $400 |
3 | D | $1250.75 |
sales列的数据类型不同意,为后续分析,所以需要将他的格式同统一
代码语言:javascript复制df["sales"] = df["sales"].replace("[$,RMB]", "", regex=True).astype("float")
代码语言:javascript复制df
customer | sales | |
---|---|---|
0 | A | 1000.00 |
1 | B | 950.50 |
2 | C | 400.00 |
3 | D | 1250.75 |
查看数据类型
代码语言:javascript复制df["sales"].apply(type)
代码语言:javascript复制0 <class 'float'>
1 <class 'float'>
2 <class 'float'>
3 <class 'float'>
Name: sales, dtype: object
数据透视表分析–melt函数
melt是逆转操作函数,可以将列名转换为列数据(columns name → column values),重构DataFrame,用法如下:
参数说明: pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None)
- frame:要处理的数据集。
- id_vars:不需要被转换的列名。
- value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。
- var_name和value_name是自定义设置对应的列名。
- col_level :如果列是MultiIndex,则使用此级别。
二维表格转成一维表格
代码语言:javascript复制d = {"district_code": [12345, 56789, 101112, 131415],
"apple": [5.2, 2.4, 4.2, 3.6],
"banana": [3.5, 1.9, 4.0, 2.3],
"orange": [8.0, 7.5, 6.4, 3.9]
}
df = pd.DataFrame(d)
df
district_code | apple | banana | orange | |
---|---|---|---|---|
0 | 12345 | 5.2 | 3.5 | 8.0 |
1 | 56789 | 2.4 | 1.9 | 7.5 |
2 | 101112 | 4.2 | 4.0 | 6.4 |
3 | 131415 | 3.6 | 2.3 | 3.9 |
df = df.melt(id_vars="district_code",
var_name="fruit_name",
value_name="price")
df
district_code | fruit_name | price | |
---|---|---|---|
0 | 12345 | apple | 5.2 |
1 | 56789 | apple | 2.4 |
2 | 101112 | apple | 4.2 |
3 | 131415 | apple | 3.6 |
4 | 12345 | banana | 3.5 |
5 | 56789 | banana | 1.9 |
6 | 101112 | banana | 4.0 |
7 | 131415 | banana | 2.3 |
8 | 12345 | orange | 8.0 |
9 | 56789 | orange | 7.5 |
10 | 101112 | orange | 6.4 |
11 | 131415 | orange | 3.9 |
将分类中出现次数较少的值归为others
代码语言:javascript复制d = {"name": ['Jone', 'Alica', 'Emily', 'Robert', 'Tomas',
'Zhang', 'Liu', 'Wang', 'Jack', 'Wsx', 'Guo'],
"categories": ["A", "C", "A", "D", "A",
"B", "B", "C", "A", "E", "F"]}
df = pd.DataFrame(d)
df
name | categories | |
---|---|---|
0 | Jone | A |
1 | Alica | C |
2 | Emily | A |
3 | Robert | D |
4 | Tomas | A |
5 | Zhang | B |
6 | Liu | B |
7 | Wang | C |
8 | Jack | A |
9 | Wsx | E |
10 | Guo | F |
D、E、F 仅在分类中出现一次,A 出现次数较多。
- 统计出现次数,并标准化
frequencies = df["categories"].value_counts(normalize=True)
frequencies
代码语言:javascript复制A 0.363636
B 0.181818
C 0.181818
E 0.090909
D 0.090909
F 0.090909
Name: categories, dtype: float64
- 设定阈值
threshold = 0.1
small_categories = frequencies[frequencies < threshold].index
small_categories
代码语言:javascript复制Index(['E', 'D', 'F'], dtype='object')
- 替换
df["categories"] = df["categories"].replace(small_categories, "Others")
代码语言:javascript复制df
name | categories | |
---|---|---|
0 | Jone | A |
1 | Alica | C |
2 | Emily | A |
3 | Robert | Others |
4 | Tomas | A |
5 | Zhang | B |
6 | Liu | B |
7 | Wang | C |
8 | Jack | A |
9 | Wsx | Others |
10 | Guo | Others |
Python合并多个EXCEL工作表
多个EXCECL合并到一个工作表中,Python来帮你实现
代码语言:javascript复制# -*- coding:utf-8 -*-
# @Address:https://beishan.blog.csdn.net/
# @Author:北山啦
import pandas as pd
import os
os.chdir(r"E:北山啦五省PM2.5")
path = "./archive/"
dfs,index = [],0
for i in os.listdir(path):
dfs.append(pd.read_csv(os.path.join(path,i)))
print(f"正在合并{index 1}工作表")
index = 1
df = pd.concat(dfs)
df.to_csv("./archive/数据汇总.csv",index=False)
pandas中Series和Dataframe数据类型互转
pandas中series和dataframe数据类型互转
- 利用
to_frame()
实现Series转DataFrame - 利用
squeeze()
实现单列数据DataFrame转Series
s = pd.Series([1,2,3])
代码语言:javascript复制s
代码语言:javascript复制0 1
1 2
2 3
dtype: int64
代码语言:javascript复制s = s.to_frame(name="列名")
代码语言:javascript复制s
列名 | |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
s.squeeze()
代码语言:javascript复制0 1
1 2
2 3
Name: 列名, dtype: int64
相同字段合并
代码语言:javascript复制from collections import Counter
trd = dict(Counter(train_label_names))
tsd = dict(Counter(test_label_names))
(pd.DataFrame([[key, trd[key], tsd[key]] for key in trd],
columns=['Target Label', 'Train Count', 'Test Count'])
.sort_values(by=['Train Count', 'Test Count'],
ascending=False))
到这里就结束了,如果对你有帮助,欢迎点赞关注评论,你的点赞对我很重要
Python小技巧
简单的表达式
列表推导式
例如,假设我们想创建一个正方形列表,例如
代码语言:javascript复制squares = []
for x in range(10):
squares.append(x**2)
squares
代码语言:javascript复制[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
代码语言:javascript复制squares = list(map(lambda x: x**2, range(10)))
squares
代码语言:javascript复制[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
代码语言:javascript复制squares = [x**2 for x in range(10)]
squares
代码语言:javascript复制[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
同时还可以利用if来过滤列表
代码语言:javascript复制[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
代码语言:javascript复制[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
列表推导式可以包含复杂表达式和嵌套函数
代码语言:javascript复制from math import pi
[str(round(pi, i)) for i in range(1, 6)]
代码语言:javascript复制['3.1', '3.14', '3.142', '3.1416', '3.14159']
列表推导式中的初始表达式可以是任意表达式,包括另一个列表推导式。
下面的列表推导式将对行和列进行转置
代码语言:javascript复制matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
代码语言:javascript复制[[row[i] for row in matrix] for i in range(4)]
代码语言:javascript复制[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
交换变量
代码语言:javascript复制a = 1
b = 2
a, b = b, a
print("a = ",a)
print("b = ",b)
代码语言:javascript复制a = 2
b = 1
检查对象使用内存情况
sys.getsizeof()
range()函数返回的是一个类,在使用内存方面,range远比实际的数字列表更加高效
代码语言:javascript复制import sys
mylist = range(1,10000)
print(sys.getsizeof(mylist))
代码语言:javascript复制48
合并字典
从Python3.5开始,合并字典的操作更加简单 如果key重复,那么第一个字典的key会被覆盖
代码语言:javascript复制d1 ={"a":1,"b":2}
d2 = {"b":2,"c":4}
m = {**d1,**d2}
print(m)
代码语言:javascript复制{'a': 1, 'b': 2, 'c': 4}
字符串分割成列表
代码语言:javascript复制string = "the author is beishanla"
s = string.split(" ")
s
代码语言:javascript复制['the', 'author', 'is', 'beishanla']
字符串列表创建字符串
代码语言:javascript复制l = ["the","author","is","beishanla"]
l = " ".join(l)
l
代码语言:javascript复制'the author is beishanla'
Python查看图片
代码语言:javascript复制pip install Pillow
代码语言:javascript复制from PIL import Image
im = Image.open("E:/Python/00网络爬虫/Project/词云图跳舞视频/aip-python-sdk-4.15.1/pictures/img_88.jpg")
im.show()
代码语言:javascript复制print(im.format,im.size,im.mode)
代码语言:javascript复制JPEG (1920, 1080) RGB
itertools模块combinations
combinations(iterable, r)方法可以创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序。
代码语言:javascript复制import itertools
list1 = [1,3,4,5]
list2 = []
for i in range(1,len(list1) 1):
iter1 = itertools.combinations(list1,i)
list2.append(list(iter1))
print(list2)
代码语言:javascript复制[[(1,), (3,), (4,), (5,)], [(1, 3), (1, 4), (1, 5), (3, 4), (3, 5), (4, 5)], [(1, 3, 4), (1, 3, 5), (1, 4, 5), (3, 4, 5)], [(1, 3, 4, 5)]]
代码语言:javascript复制import itertools
list1 = [1,2,3,4]
list2 = list(itertools.combinations(list1,2))
list2
代码语言:javascript复制[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
itertools中reduce
reduce() 函数会对参数序列中元素进行累积。
reduce(function, iterable[, initializer])
- function – 函数,有两个参数
- iterable – 可迭代对象
- initializer – 可选,初始参数
from functools import reduce
def add(x, y) : # 两数相加
return x y
sum1 = reduce(add, [1,2,3,4,5]) # 计算列表和:1 2 3 4 5
sum2 = reduce(lambda x, y: x y, [1,2,3,4,5]) # 使用 lambda 匿名函数
print(sum1)
print(sum2)
代码语言:javascript复制15
15
字典.get()方法
D.get(key[,default=None])
- key – 字典中要查找的键。
- default – 可选参数,如果指定键的值不存在时,返回该值,默认为 None。
D = {"姓名":"北山啦",
"博客地址":"https://beishan.blog.csdn.net/"}
print(D.get("姓名"))
print(D.get("Sex","NA"))
代码语言:javascript复制北山啦
NA
解压zip压缩包到指定文件路径
代码语言:javascript复制import zipfile
import os
src_path=r"D:浏览器chromechromedriver_win32.zip"
target_path="D:浏览器chrome数据"
if(not os.path.isdir(target_path)):
z = zipfile.ZipFile(src_path, 'r')
z.extractall(path=target_path)
z.close()
综合案例
演员关系分析
假设当前文件夹中有“电影导演演员.xlsx”,要求统计所有演员中关系最好的n个演员及其共同参演电影数量,其中n可以指定为大于或等于2的整数。关系好的定义为共同参演电影数量最多
1 .字典的get方法
D.get(key[,default=None])
- key – 字典中要查找的键。
- default – 可选参数,如果指定键的值不存在时,返回该值,默认为 None。
from itertools import combinations
from functools import reduce
import openpyxl
from openpyxl import Workbook
def getActors(filename):
actors = dict()
# 打开xlsx文件,并获取第一个worksheet
wb = openpyxl.load_workbook(filename)
ws = wb.worksheets[0]
# 遍历Excel文件中的所有行
for index, row in enumerate(ws.rows):
# 绕过第一行的表头
if index == 0:
continue
# 获取电影名称和演员列表
filmName, actor = row[0].value, row[2].value.split(',')
# 遍历该电影的所有演员,统计参演电影
for a in actor:
actors[a] = actors.get(a, set())
actors[a].add(filmName)
print(actors)
return actors
data = getActors('电影导演演员.xlsx')
代码语言:javascript复制def relations(num):
# 参数num表示要查找关系最好的num个人
# 包含全部电影名称的集合
allFilms = reduce(lambda x,y: x|y, data.values(), set())
# 关系最好的num个演员及其参演电影名称
combiData = combinations(data.items(), num)
trueLove = max(combiData,
key=lambda item: len(reduce(lambda x,y:x&y,
[i[1] for i in item],
allFilms)))
return ('关系最好的{0}个演员是{1},'
'Ta们共同主演的电影数量是{2}'.format(num,
tuple((item[0] for item in trueLove)),
len(reduce(lambda x,y:x&y,
[item[1] for item in trueLove],
allFilms))))
print(relations(2))
print(relations(3))
print(relations(4))
欢迎收藏,持续更新
到这里就结束了,如果对你有帮助,欢迎点赞关注,你的点赞对我很重要。作者:北山啦