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要计算) -> Series[int])

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'''
相关推荐
四口鲸鱼爱吃盐19 分钟前
Pytorch | 利用SMI-FGRM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python·深度学习·机器学习·计算机视觉
我叫czc40 分钟前
【Python高级366】静态Web服务器开发
服务器·前端·python
lmxnsI1 小时前
后端项目打包发布
ide·python·pycharm
HsuHeinrich1 小时前
流程图(二)利用python绘制网络图
python·数据可视化
爱学习的Allan2 小时前
使用 pyreqs 快速创建 requirements.txt & PyCharm 中 UnicodeDecodeError 问题
ide·python·pycharm·pip
HackKong2 小时前
高校网络安全_网络安全之道
java·网络·c++·python·学习·web安全·黑客技术
statistican_ABin2 小时前
R语言数据分析案例47-上海译文出版社旗舰店图书分析和可视化
数据挖掘·数据分析
yangjiwei02072 小时前
数据结构-排序
数据结构·python
秋天下着雨3 小时前
apifox调用jar程序
java·python·jar
bs_1013 小时前
【保姆式】python调用api通过机器人发送文件到飞书指定群聊
python·机器人·飞书