前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python常用小技巧总结

Python常用小技巧总结

作者头像
北山啦
发布2022-11-27 13:06:25
9.4K0
发布2022-11-27 13:06:25
举报
文章被收录于专栏:北山啦的博客北山啦的博客

Pandas数据分析常用小技巧


数据分析中pandas的小技巧,快速进行数据预处理,欢迎点赞收藏,持续更新,作者:北山啦


在这里插入图片描述
在这里插入图片描述

文章目录

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:\浏览器\chrome\chromedriver_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))
在这里插入图片描述
在这里插入图片描述

欢迎收藏,持续更新


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pandas数据分析常用小技巧
    • 文章目录
    • Pandas小技巧
      • pandas生成数据
        • 导入数据
          • 导出数据
            • 查看数据
              • 数据选择
                • 数据处理
                  • 数据分组
                    • 数据合并
                      • 数据替换–map映射
                        • 数据清洗–replace和正则
                          • 数据透视表分析–melt函数
                            • 将分类中出现次数较少的值归为others
                              • Python合并多个EXCEL工作表
                                • pandas中Series和Dataframe数据类型互转
                                  • 相同字段合并
                                  • Python小技巧
                                    • 简单的表达式
                                      • 列表推导式
                                        • 交换变量
                                          • 检查对象使用内存情况
                                            • 合并字典
                                              • 字符串分割成列表
                                                • 字符串列表创建字符串
                                                  • Python查看图片
                                                    • itertools模块combinations
                                                      • itertools中reduce
                                                        • 字典.get()方法
                                                          • 解压zip压缩包到指定文件路径
                                                          • 综合案例
                                                            • 演员关系分析
                                                            领券
                                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档