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

文章目录

  • 学习内容:
    • 一、 数据分箱
    • 二、自定义函数
    • 三、DataFrame 其他常用函数


学习内容:

一、 数据分箱

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

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 列分箱

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. 基本操作

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. 自定义函数方式计算后区和

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. 拆分后运用自定义函数求前区和

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)

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)

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)

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)

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

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

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

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

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

**(三)缺失值操作

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

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

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

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)

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

df.公司.fillna('A',inplace=True)
df.性别.fillna(method='bfill',inplace=True)
'''df更改为:
	公司	性别	人数
0	B	女	40
1	A	女	31
2	B	男	28
3	A	男	28'''

你可能感兴趣的:(#,python数据分析,python,数据分析,pandas)