文章目录
学习内容:
一、 数据分箱
将 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'''