Python常用小技巧总结

2022-11-27 13:06:25 浏览数 (1)

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 – 一个或多个序列
代码语言:javascript复制
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

代码语言:javascript复制
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 出现次数较多。

  1. 统计出现次数,并标准化
代码语言:javascript复制
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
  1. 设定阈值
代码语言:javascript复制
threshold = 0.1
small_categories = frequencies[frequencies < threshold].index
small_categories
代码语言:javascript复制
Index(['E', 'D', 'F'], dtype='object')
  1. 替换
代码语言:javascript复制
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
代码语言:javascript复制
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

代码语言:javascript复制
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 – 可选,初始参数
代码语言:javascript复制
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。
代码语言:javascript复制
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。
代码语言:javascript复制
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))

欢迎收藏,持续更新


到这里就结束了,如果对你有帮助,欢迎点赞关注,你的点赞对我很重要。作者:北山啦

0 人点赞