
作者 | 刘顺祥盘点Pandas 的100 个常用函数mp.weixin.qq.com
来源 | 数据分析1480
Pandas 常用函数汇总
数据统计
S 表示 Pandas 中的序列 Series 对象
|函数|含义|说明| |:-:|:-:|:-:| |s.min|计算最小值|| |s.max|计算最大值|| |s.sum|求和|| |s.mean|计算平均值|| |s.count|计数|统计非缺失元素的个数| |s.size|计数|统计所有元素的个数| |s.median|计算中位数|| |s.var|计算方差|| |s.std|计算标准差||
|函数|含义|说明| |:-:|:-:|:-:| |s.quantile|计算任意分位数|| |s.cov|计算协方差|| |s.corr|计算相关系数|| |s.skew|计算偏度|| |s.kurt|计算峰度|| |s.mode|计数众数|| |s.describe|描述性统计|一次性返回多个统计结果| |s.groupby|分组|| |s.aggregate|聚合运算|可以自定义统计函数|
import pandas as pd
import numpy as np
x = pd.Series(np.random.normal(2, 3, 1000))
y = 2 * x + pd.Series(np.random.normal(1, 2, 1000))
# x 与 y 的相关系数
print(x.corr(y))
print(y.corr(x))
# y 的偏度
print(y.skew())
# y 的统计描述值
print(x.describe())
z = pd.Series(['A', 'B', 'C']).sample(n=1000, replace=True) # 有放回抽样
print(z.head())
# 重新修改 z 的行索引
z.index = range(1000)
# 按照 z 分组,统计 y 的组内平均值
y.groupby(by=z).aggregate(np.mean)
0.9501615962384593
0.9501615962384593
-0.05085778882750406
count 1000.000000
mean 2.116362
std 2.978162
min -6.694530
25% 0.085229
50% 2.049701
75% 4.158076
max 11.854475
dtype: float64
2 C
1 B
0 A
2 C
2 C
dtype: object
A 5.318871
B 5.161616
C 4.867143
dtype: float64
|函数|含义|说明| |:-:|:-:|:-:| |s.argmin|寻找最小值所在位置|| |s.argmax|寻找最大值所在位置|| |s.any|等价于逻辑或|| |s.all|等价于逻辑与|| |s.value_counts|频次统计|| |s.cumsun|运算累计和|| |s.cumprod|运算累计积|| |s.pct_change|运算比率|后一个元素与前一个元素的比率|
# 统计 z 中元素的频次
print(z.value_counts())
a = pd.Series([1, 5, 10, 15, 25, 30])
# 计算 a 中各元素的累计百分比
print(a.cumsum())
print(a.cumsum() / a.cumsum()[a.size - 1])
B 360
A 332
C 308
dtype: int64
0 1
1 6
2 16
3 31
4 56
5 86
dtype: int64
0 0.011628
1 0.069767
2 0.186047
3 0.360465
4 0.651163
5 1.000000
dtype: float64
数据清洗
|函数|含义|说明| |:-:|:-:|:-:| |s.duplicated|判断序列中元素是否重复|| |s.drop_duplicates|删除重复值|| |s.hasnans|判断序列是否存在缺失值|仅返回 True 或者 False| |s.isnull|判断序列元素是否为缺失|返回和序列长度一样的 bool 值| |s.notnull|判断序列元素是否不为缺失|返回和序列长度一样的 bool 值| |s.dropna|删除缺失值|| |s.fillna|缺失值填充|| |s.ffill|前向填充缺失值|使用缺失值的前一个元素填充| |s.bfill|后向填充缺失值|使用缺失值的后一个元素填充|
x = pd.Series([10, 13, np.nan, 17, 28, 19, 33, np.nan, 27])
# 检查序列中是否存在缺失值
print(x.hasnans)
# 将缺失值填充为平均值
print(x.fillna(value=x.mean()))
# 前向缺失值填充
print(x.ffill())
True
0 10.0
1 13.0
2 21.0
3 17.0
4 28.0
5 19.0
6 33.0
7 21.0
8 27.0
dtype: float64
0 10.0
1 13.0
2 13.0
3 17.0
4 28.0
5 19.0
6 33.0
7 33.0
8 27.0
dtype: float64
|函数|含义|说明| |:-:|:-:|:-:| |s.dtypes|检查数据类型|| |s.astype|类型强制转换|| |pd.to_datetime|转日期时间类型|| |s.factorize|因子化转换|| |s.sample|抽样|| |s.where|基于条件判断的值替换|| |s.replace|按值替换|不可使用正则| |s.str.replace|按值替换|可使用正则| |s.str.split|字符分割||
income = pd.Series(['12500元', '8000元', '8500元', '15000元', '9000元'])
# 将收入转化为整形
print(income.str[:-1].astype(int))
gender = pd.Series(['男', '女', '女', '女', '男', '女'])
# 性别因子化处理
print(gender.factorize())
house = pd.Series(['大宁金茂府 | 3室2厅 | 158.32平米 | 南 | 精装',
'昌里花园 | 2室2厅 | 104.73平米 | 南 | 精装',
'纺大小区 | 3室1厅 | 68.38平米 | 南 | 简装'])
# 取出二手房的面积,并转换为浮点型
house.str.split('|').str[2].str.strip().str[:-2].astype(float)
0 12500
1 8000
2 8500
3 15000
4 9000
dtype: int64
(array([0, 1, 1, 1, 0, 1]), Index(['男', '女'], dtype='object'))
0 158.32
1 104.73
2 68.38
dtype: float64
数据筛选
|函数|含义|说明| |:-:|:-:|:-:| |s.isin|成员关系判断|| |s.between|区间判断|| |s.loc|条件判断|可使用在数据框中| |s.iloc|索引判断|可使用在数据框中| |s.compress|条件判断|已废弃,使用 series[Condition]代替 |s.nlargest|搜寻最大的n个元素|| |s.nsmallest|搜寻最小的n个元素|| |s.str.findall|子串查询|可使用正则|
np.random.seed(2020)
x = pd.Series(np.random.randint(10, 20, 10))
print(x)
# 筛选出 16 以上的元素
print(x.loc[x > 16])
print(x[x > 16])
# 筛选出 13~16 之间的元素
print(x[x.between(13, 16)])
# 取出最大的三个元素
print(x.nlargest(3))
y = pd.Series(['ID:1 name:张三 age:24 income:13500',
'ID:2 name:李四 age:27 income:25000',
'ID:3 name:王二 age:21 income:8000'])
# 取出年龄,并转换为整数
print(y.str.findall('age:(d+)').str[0].astype(int))
0 10
1 18
2 13
3 16
4 13
5 13
6 17
7 18
8 10
9 10
dtype: int64
1 18
6 17
7 18
dtype: int64
1 18
6 17
7 18
dtype: int64
2 13
3 16
4 13
5 13
dtype: int64
1 18
7 18
6 17
dtype: int64
0 24
1 27
2 21
dtype: int64
绘图与元素级函数
|函数|含义|说明| |:-:|:-:|:-:| |s.hist|绘制直方图|| |s.plot|可基于kind参数绘制更多图形|饼图、折线图、箱线图等| |s.map|元素映射|| |s.apply|基于自定义函数的元素级操作||
np.random.seed(2020)
import matplotlib.pyplot as plt
x = pd.Series(np.random.normal(10, 3, 1000))
# 绘制 x 直方图
x.hist()
# 显示图形
plt.show()
# 绘制 x 的箱线图
x.plot(kind='box')
plt.show()
installs = pd.Series(['1280万', '6.7亿', '248万', '1892万', '9877', '9877万', '1.2亿'])
# 将安装量统一更改为‘万’的单位
def transform(x):
if x.find('亿') != -1:
res = float(x[:-1]) * 10000
elif x.find('万') != -1:
res = float(x[:-1])
else:
res = float(x) / 10000
return res
installs.apply(transform)


0 1280.0000
1 67000.0000
2 248.0000
3 1892.0000
4 0.9877
5 9877.0000
6 12000.0000
dtype: float64
时间序列函数
|函数|含义|说明| |:-:|:-:|:-:| |s.dt.date|抽取出日期值|s为日期时间型序列, 年-月-日| |s.dt.time|抽取出时间|时:分:秒| |s.dt.year|抽取出年|| |s.dt.month|抽取出月|| |s.dt.day|抽取出日|| |s.dt.hour|抽取出时|| |s.dt.minute|抽取出分钟|| |s.dt.second|抽取出秒|| |s.dt.quarter|抽取出季度|| |s.dt.weekday|抽取出星期几|返回数值型| |s.dt.weekday_name|抽取出星期几|返回字符型| |s.dt.week|抽取出年终的第几周|| |s.dt.dayofyear|抽取出年中的第几天|| |s.dt.dayinmonth|抽取出月对应的最大天数|| |s.dt.is_month_start|判断日期是否为当月的第一天|| |s.dt.is_month_end|判断日期是否为当月的最后一天|| |s.dt.is_quarter_start|判断日期是否为当季度的第一天|| |s.dt.is_quarter_end|判断日期是否为当季度的最后一天|| |s.dt.is_year_start|判断日期是否为当年的第一天|| |s.dt.is_year_end|判断日期是否为当年的最后一天|| |s.dt.is_leap_year|判断日期是否为闰年||
其他函数
|函数|含义|说明| |:-:|:-:|:-:| |s.append|序列元素的追加|需指定其他序列| |s.diff|一阶差分|| |s.round|元素的四舍五入|| |s.sort_values|按值排序|| |s.sort_index|按索引排序|| |s.to_dict|转为字典|| |s.tolist|转为列表|| |s.unique|元素去重||
import numpy as np
import pandas as pd
np.random.seed(2020)
x = pd.Series(np.random.randint(8,18,6))
print(x)
# 对x中的元素做一阶差分
print(x.diff())
# 对x中的元素做降序处理
print(x.sort_values(ascending = False))
y = pd.Series(np.random.randint(8,16,100))
# 将y中的元素做排重处理,并转换为列表对象
print(y)
print(y.unique().tolist())
0 8
1 16
2 11
3 14
4 11
5 11
dtype: int64
0 NaN
1 8.0
2 -5.0
3 3.0
4 -3.0
5 0.0
dtype: float64
1 16
3 14
5 11
4 11
2 11
0 8
dtype: int64
0 15
1 8
2 13
3 8
4 8
5 8
6 10
7 9
8 11
9 11
10 15
11 10
12 14
13 11
14 14
15 13
16 8
17 12
18 12
19 8
20 14
21 12
22 9
23 9
24 15
25 13
26 10
27 9
28 14
29 13
..
70 11
71 10
72 8
73 8
74 15
75 14
76 12
77 14
78 14
79 10
80 12
81 14
82 14
83 13
84 8
85 15
86 9
87 9
88 15
89 9
90 13
91 9
92 15
93 9
94 8
95 9
96 15
97 10
98 11
99 13
Length: 100, dtype: int64
[15, 8, 13, 10, 9, 11, 14, 12]