Python常用小技巧总结

Pandas数据分析常用小技巧


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


在这里插入图片描述


Pandas小技巧

import pandas as pd

pandas生成数据

d = {"sex": ["male", "female", "male", "female"],
     "color": ["red", "green", "blue", "yellow"],
     "age": [12, 56, 21, 31]}
df = pd.DataFrame(d)
df
sexcolorage
0malered12
1femalegreen56
2maleblue21
3femaleyellow31

导入数据

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表格

导出数据

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(⼯作表)

查看数据

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字段数据重复的个数

数据选择

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的数据

数据处理

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) # 批量重命名索引

数据分组

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连⽤,避免索引更改

数据合并

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
sexcoloragegender
0malered121
1femalegreen560
2maleblue211
3femaleyellow310

数据清洗–replace和正则

分享pandas数据清洗技巧,在某列山使用replace和正则快速完成值的清洗

d = {"customer": ["A", "B", "C", "D"],
     "sales": [1000, "950.5RMB", "$400", "$1250.75"]}
df = pd.DataFrame(d)
df
customersales
0A1000
1B950.5RMB
2C$400
3D$1250.75

sales列的数据类型不同意,为后续分析,所以需要将他的格式同统一

df["sales"] = df["sales"].replace("[$,RMB]", "", regex=True).astype("float")
df
customersales
0A1000.00
1B950.50
2C400.00
3D1250.75

查看数据类型

df["sales"].apply(type)
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,则使用此级别。

二维表格转成一维表格

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_codeapplebananaorange
0123455.23.58.0
1567892.41.97.5
21011124.24.06.4
31314153.62.33.9
df = df.melt(id_vars="district_code",
             var_name="fruit_name",
             value_name="price")
df
district_codefruit_nameprice
012345apple5.2
156789apple2.4
2101112apple4.2
3131415apple3.6
412345banana3.5
556789banana1.9
6101112banana4.0
7131415banana2.3
812345orange8.0
956789orange7.5
10101112orange6.4
11131415orange3.9

将分类中出现次数较少的值归为others

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
namecategories
0JoneA
1AlicaC
2EmilyA
3RobertD
4TomasA
5ZhangB
6LiuB
7WangC
8JackA
9WsxE
10GuoF

D、E、F 仅在分类中出现一次,A 出现次数较多。

  1. 统计出现次数,并标准化
frequencies = df["categories"].value_counts(normalize=True)
frequencies
A    0.363636
B    0.181818
C    0.181818
E    0.090909
D    0.090909
F    0.090909
Name: categories, dtype: float64
  1. 设定阈值
threshold = 0.1
small_categories = frequencies[frequencies < threshold].index
small_categories
Index(['E', 'D', 'F'], dtype='object')
  1. 替换
df["categories"] = df["categories"].replace(small_categories, "Others")
df
namecategories
0JoneA
1AlicaC
2EmilyA
3RobertOthers
4TomasA
5ZhangB
6LiuB
7WangC
8JackA
9WsxOthers
10GuoOthers

Python合并多个EXCEL工作表

多个EXCECL合并到一个工作表中,Python来帮你实现

# -*- 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])
s
0    1
1    2
2    3
dtype: int64
s = s.to_frame(name="列名")
s
列名
01
12
23
s.squeeze()
0    1
1    2
2    3
Name: 列名, dtype: int64

相同字段合并

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小技巧

简单的表达式

在这里插入图片描述

列表推导式

例如,假设我们想创建一个正方形列表,例如

squares = []
for x in range(10):
    squares.append(x**2)
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
squares = list(map(lambda x: x**2, range(10)))
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
squares = [x**2 for x in range(10)]
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

同时还可以利用if来过滤列表

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

列表推导式可以包含复杂表达式和嵌套函数

from math import pi
[str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

列表推导式中的初始表达式可以是任意表达式,包括另一个列表推导式。

下面的列表推导式将对行和列进行转置

matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
[[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

交换变量

a = 1
b = 2
a, b = b, a
print("a = ",a)
print("b = ",b)
a =  2
b =  1

检查对象使用内存情况

sys.getsizeof()

range()函数返回的是一个类,在使用内存方面,range远比实际的数字列表更加高效

import sys
mylist = range(1,10000)
print(sys.getsizeof(mylist))
48

合并字典

从Python3.5开始,合并字典的操作更加简单
如果key重复,那么第一个字典的key会被覆盖

d1 ={"a":1,"b":2}
d2 = {"b":2,"c":4}
m = {**d1,**d2}
print(m)
{'a': 1, 'b': 2, 'c': 4}

字符串分割成列表

string = "the author is beishanla"
s = string.split(" ")
s
['the', 'author', 'is', 'beishanla']

字符串列表创建字符串

l = ["the","author","is","beishanla"]
l = " ".join(l)
l
'the author is beishanla'

Python查看图片

pip install Pillow
from PIL import Image
im = Image.open("E:/Python/00网络爬虫/Project/词云图跳舞视频/aip-python-sdk-4.15.1/pictures/img_88.jpg")
im.show()
print(im.format,im.size,im.mode)
JPEG (1920, 1080) RGB

itertools模块combinations

combinations(iterable, r)方法可以创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序。

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)
[[(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)]]
import itertools
list1 = [1,2,3,4]
list2 = list(itertools.combinations(list1,2))
list2
[(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)
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"))
北山啦
NA

解压zip压缩包到指定文件路径

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。
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')

在这里插入图片描述

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))

在这里插入图片描述

欢迎收藏,持续更新


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北山啦

这个功能还没人试过呢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值