Python 数据分析— Pandas 基本操作(下)

文章目录


学习内容:

一、 数据分箱

将 Series 的每个值对应到区间。

cut(x=分箱对象Series或1维数组, bins=分箱数或区间, right=是否包含右值, labels=标签)
1. 对1维数组进行分箱

python 复制代码
np.random.seed(666)
s = np.random.randint(25, 100, size=10)
#s值:array([27, 70, 55, 87, 95, 98, 55, 61, 86, 76])
#指定区段数分箱
pd.cut(s,bins=3) # 用3个区段对s分箱,包含区段右值
'''输出:
[[27.0, 50.667), [50.667, 74.333), [50.667, 74.333), [74.333, 98.071), [74.333, 98.071), [74.333, 98.071), [50.667, 74.333), [50.667, 74.333), [74.333, 98.071), [74.333, 98.071)]
Categories (3, interval[float64, left]): [[27.0, 50.667) < [50.667, 74.333) < [74.333, 98.071)]'''
#指定区段值([0-60) [60-85) [85-101))分箱
pd.cut(s, bins=[0, 60, 85, 101],right=False)
'''输出:
[[0, 60), [60, 85), [0, 60), [85, 101), [85, 101), [85, 101), [0, 60), [60, 85), [85, 101), [60, 85)]
Categories (3, interval[int64, left]): [[0, 60) < [60, 85) < [85, 101)]'''

2. 对 DataFram 列分箱

python 复制代码
np.random.seed(666)
df = pd.DataFrame(np.random.randint(20,100,5),columns=['成绩'])
'''df结构:
	成绩
0	22
1	65
2	50
3	82
4	90'''
df['等次'] = pd.cut(df.成绩, bins=[0, 60, 85, 101],right=False, labels=['差', '中', '好'])
'''df结构:
	成绩	等次
0	22	差
1	65	中
2	50	差
3	82	中
4	90	好'''

二、自定义函数

apply(操作函数, axis=0默认按列 | 1按行) -> Series
1. 基本操作

python 复制代码
df = pd.read_excel('大乐透开奖信息.xlsx')
df.head()
'''输出:
	开奖期号	前区1	前区2	前区3	前区4	前区5	后区1	后区2
0	24094	12		13		24		29		31		2		8
1	24093	16		24		26		28		29		8		12
2	24092	2		4		25		26		31		1		6
3	24091	1		8		11		17		21		1		2
4	24090	2		3		6		28		33		7		11'''
#按列求和
df.apply(np.sum, axis=0)
'''输出:
开奖期号    1227519
前区1         318
前区2         607
前区3         946
前区4        1247
前区5        1509
后区1         221
后区2         427
dtype: int64'''
#按行求和(只算前5行)
df.head().apply(np.sum, axis=1)
'''输出:
0    24213
1    24236
2    24187
3    24152
4    24180
dtype: int64'''

2. 自定义函数方式计算后区和

python 复制代码
def f(x):
    return x.后区1 + x.后区2
df.apply(lambda x: f(x), axis=1)
'''输出:
0     10
1     20
2      7
3      3
4     18
......'''

3. 拆分后运用自定义函数求前区和

python 复制代码
df.iloc[:,1:6].apply(np.sum, axis=1)
'''输出:
0     109
1     123
2      88
3      58
4      72
......'''

三、DataFrame 其他常用函数

(一)更新行、列索引
1. 修改索引名(rename(index= 行索引, columns=列索引, inplace=是否修改原对象) -> None)

python 复制代码
data = {'company': ['A', 'A', 'B', 'B'],
         'gender': ['female', 'female', 'male','male'],
         'num': [40, 31, 25,28]}
df = pd.DataFrame(data)
'''df结构:
	company	gender	num
0	A		female	40
1	A		female	31
2	B		male	25
3	B		male	28'''
df.rename(columns={'company':'公司', 'gender':'性别', 'num':'人数'},index={0:'A',1:'B',2:'C',3:'D'},inplace=True)
'''修改后df
	公司	性别		人数
A	A	female	40
B	A	female	31
C	B	male	25
D	B	male	28'''

2. 将某一(多)个字段设置为索引(set_index(keys=标签列表, drop= 是否删除索引列(默认True), append=是否追加到原索引(默认False), inplace=是否更改原表(默认False)) -> None)

python 复制代码
df.set_index(['公司','性别'],drop=False,append=True)
'''输出:原表保持不变
				公司	性别		人数
公司	性别			
A	A	female	A	female	40
B	A	female	A	female	31
C	B	male	B	male	25
D	B	male	B	male	28'''

3. 以新的序列重置行索引(reset_index(drop=是否删除原索引(默认False将原索引作为新列), inplace=) -> None)

python 复制代码
df.reset_index()
'''输出:
	index	公司	性别		人数
0	A		A	female	40
1	B		A	female	31
2	C		B	male	25
3	D		B	male	28'''

(二)修改表格值
1. 去除重复值(drop_duplicates(subset=指定列, keep=保留位置 'first'默认第1个 | 'last'最后1个 | False 都不保留, inplace: = ) -> DataFrame)

python 复制代码
df.drop_duplicates('公司', keep='last')
'''输出:
	公司	性别		人数
B	A	female	31
D	B	male	28'''

2. 根据标签删除指定行、列(drop(index=行索引, columns=列索引, inplace= ) -> DataFrame)

python 复制代码
df.drop(index='B',columns='性别')
'''输出:
	公司	人数
A	A	40
C	B	25
D	B	28'''

3. 根据值筛选数据(isin(values: Iterable | Series | dict) -> Series_bool

python 复制代码
#筛选人数为40,28的数据
df.loc[df.人数.isin([40,28])]
'''输出:
	公司	性别		人数
A	A	female	40
D	B	male	28'''

**(三)缺失值操作

python 复制代码
data = {'公司': ['B', 'A', 'B', np.nan],
         '性别': ['女', '女', None,'男'],
         '人数': [40, 31, 28,28]}
df = pd.DataFrame(data)
'''df结构:
	公司	性别		人数
0	B	女		40
1	A	女		31
2	B	None	28
3	NaN	男		28'''

1. 统计对应列各值个数(value_counts(normalize=是否统计为占比 默认假, dropna=空值不计算 默认True | False要计算) -> Seriesint

python 复制代码
df.性别.value_counts(normalize=True,dropna=False)
'''输出:
女      0.50
NaN    0.25
男      0.25
Name: 性别, dtype: float64'''

2. 判断是否含有空值(isna() -> DataFrame)

python 复制代码
df.isna()
'''输出:
	公司		性别		人数
0	False	False	False
1	False	False	False
2	False	True	False
3	True	False	False'''
# 查看各列是否含空值
df.isna().any()
'''输出:
公司     True
性别     True
人数    False
dtype: bool'''

3. 删除含空值的数据(dropna(axis=轴向, inplace= ) -> DataFrame)

python 复制代码
df.dropna(axis=0) #默认,按行删除
'''输出:
	公司	性别	人数
0	B	女	40
1	A	女	31'''
df.dropna(axis=1) #按列删除
'''输出:
	人数
0	40
1	31
2	28
3	28'''

4. 空值填充(fillna(value=指定值, axis=轴向, method=对应值 pad / ffill:上一个值 | backfill / bfill:下一个值, inplace=) -> None: ...)

python 复制代码
df.公司.fillna('A',inplace=True)
df.性别.fillna(method='bfill',inplace=True)
'''df更改为:
	公司	性别	人数
0	B	女	40
1	A	女	31
2	B	男	28
3	A	男	28'''
相关推荐
AI行业学习6 分钟前
2026 版 Notepad++ 完整图文安装指南|官方渠道无捆绑,一键切换中文界面
开发语言·人工智能·python·html·notepad++
炘东59213 分钟前
求助:在另一个 Reasonix 窗口或后台运行
python
apcipot_rain18 分钟前
计科八股2026705——正态分布、独立与不相关、范数、列表元组集合、链表队列、sort函数、URL执行
python·计算机网络·概率论
江华森25 分钟前
Python 编程快速上手:让繁琐工作自动化 —— 19章全实战笔记
笔记·python·自动化
子豪-中国机器人30 分钟前
第一部分:初赛选择题(30 题,对应线上每日问答)
python
Sam092731 分钟前
【AI 算法精讲 15】余弦相似度:向量检索与归一化内积
人工智能·python·算法·ai
Starry-sky(jing)1 小时前
RecursionError: maximum recursion depth exceeded —— 你的函数调用链,踩穿了 CPython 的安全气囊
python·cpython·pydantic·recursionerror·递归深度·递归限制·sys.setrecursionlimit
cui_ruicheng1 小时前
Python从入门到实战(三):流程控制与循环语句
开发语言·python
Rauser Mack1 小时前
Vibe coding游戏实战:零代码编程五子棋小游戏
人工智能·python·游戏·html·prompt
FriendshipT1 小时前
Ultralytics:解读PSABlock模块
人工智能·pytorch·python·深度学习·目标检测