Pandas基础
数据读取处理
1 | iris = load_iris() |
1 | a.reshape(-1,1) |
选择列
1 | tr.select_dtypes(include=['int64','float64']) |
选择行
- 可以通过 “.” 来操作
df.a
- 也可以通过 “[]” 来操作
df['a']
数据格式化
- map、apply在用于Series时,对每一个值进行处理,两者并没有什么区别
- apply不仅可以用于Series,还可以用于DataFrame;而map只能用于Series。
- 一般情况下,apply应用更广泛,尤其是自定义函数带多个参数时,建议使用apply。
- applymap可以对多个Series进行操作,map和apply均不行。
apply /map/applymap 函数(常用方法)
1
2
3
4
5
6
7
8
9
10def cal_interval(df,from_date,to_date):
delta = 1
try:
f = datetime.datetime.strptime(df[from_date],"%m/%d/%Y")
t = datetime.datetime.strptime(df[to_date],"%m/%d/%Y")
delta = (t-f).days
except:
pass
return 1 if delta<=0 else delta
df['d'] = df.apply(cal_interval,axis=1,args=['Date Event Began','Date of Restoration'])1
2date = pd.period_range(start = '1990-02-01',periods=100,freq='D')
df = pd.DataFrame({'date':date,'val':np.random.randn(len(date)),'val2':np.random.randn(len(date))})date val val2 0 1990-02-01 0.771114 0.223646 1 1990-02-02 -0.630781 -1.231217 2 1990-02-03 -0.435648 -1.324931 3 1990-02-04 2.459657 1.195601 4 1990-02-05 0.378009 2.207286 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52# apply默认是作用于列,要作用于行的话需要加上axis=1
q2.apply(lambda x:x.原价==x.实价,axis=1)
# 保留两位小数(类型变成Object)
df.val.apply(lambda x: format(x,'.2f'))
# 或者
df.val.apply(lambda x: '{:.2f}'.format(x))
# 四舍五入保留两位小数
df.val.round(2)
# 转为百分比,并保留2位小数 lambda 写法
df.val.map(lambda x: "{:.2%}".format(x))
# 或者
q2_df[col].apply(lambda x:format(x,'.2%'))
# 正常函数写法(不推荐)
def turn_percentage(x):
return '%.2f%%' % (x * 100);
df.val.apply(turn_percentage)
# 将获奖时间格式化为x月x日
df.date.apply(lambda x:x.strftime('%m月%d日'))
# 将Series中的数据和字符拼接
df.val.apply(lambda x: f'随机数: {x}')
# applymap可以对多个Series进行操作
df[['val','val1']].applymap(lambda x:format(x,'.2f'))
# 构建apply函数
def judge_state(row):
if row['Austin - EV'] <=0.01:
return 'Off'
elif row['Austin - EV']>0.01:
return 'On'
# 应用apply函数
df_Austin_ev = df.apply(judge_state,axis = 1)
# map传入字典 其余值均变为NaN
df1 = pd.DataFrame({'A':['a','b','c','d']})
df1.A=df1.A.map({'a':'A','b':'B'})
# df使用apply还可以传其他参
import statsmodels.api as sm
def regress(data, yvar, xvars):
Y = data[yvar]
X = data[xvars]
X['intercept'] = 1.
result = sm.OLS(Y, X).fit()
return result.params
by_year.apply(regress, 'AAPL', ['SPX'])groupby后的apply
1 | # 数据是tg_id,month,q1-q96,求每个月q1-q96中最大的点 |
将含有空白符的列转float
1
df.a.replace(r'^\s*$', np.nan, regex=True)
日期
- 将日的数据转为以月为统计的数据
1 | # 提取日期中的date |
CRUD
一般来说pandas操作都不会在原dataframe进行修改,通过inplace=True可以实现就地修改。
列操作
1 | # 重命名特定列名 |
行操作
1 | ''' |
Create
- 创建DataFrame
1 | # 使用 list 生成 |
Del
删除某列的数据
- axis:轴。0 或 ‘index’,表示按行删除;1或’columns’,表示按列删除。
1
2
3
4# del 只能删一行
del df['a']
# 等价于
df.drop('a',axis=1,inplace=True)
Update
- where操作
1 | # 如果一个国家的金牌数大于 30 则值为 是,反之为 否 |
- 更新索引
1 | # 索引从1开始 |
- replace
1 | # 将金牌数列的数字 0 替换为 无 |
- fill
1 | ''' |
-
Retrieve
- 随机返回n个样本
1 | df.sample(n) |
- pivot与groupby
1 | pd.pivot_table(df2,values = ['奖牌类型'],index = ['国家','运动类别'],aggfunc = 'count') |
- unstack
1 | # 计算前十名各国每日奖牌数量合计 |
- 数据聚合
positionName | companySize | industryField | financeStage | companyLabelList | firstType | secondType | thirdType | createTime | district | salary | workYear | jobNature | education | positionAdvantage | imState | score | matchScore | famousCompany | Hobby | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 数据分析 | 50-150人 | 移动互联网,电商 | A轮 | [‘绩效奖金’, ‘带薪年假’, ‘定期体检’, ‘弹性工作’] | 产品|需求|项目类 | 数据分析 | 数据分析 | 2020/3/16 11:00 | 余杭区 | 37500 | 1-3年 | 全职 | 本科 | 五险一金、弹性工作、带薪年假、年度体检 | today | 233 | 15.101875 | False | ‘绩效奖金’ |
0 | 数据分析 | 50-150人 | 移动互联网,电商 | A轮 | [‘绩效奖金’, ‘带薪年假’, ‘定期体检’, ‘弹性工作’] | 产品|需求|项目类 | 数据分析 | 数据分析 | 2020/3/16 11:00 | 余杭区 | 37500 | 1-3年 | 全职 | 本科 | 五险一金、弹性工作、带薪年假、年度体检 | today | 233 | 15.101875 | False | ‘带薪年假’ |
0 | 数据分析 | 50-150人 | 移动互联网,电商 | A轮 | [‘绩效奖金’, ‘带薪年假’, ‘定期体检’, ‘弹性工作’] | 产品|需求|项目类 | 数据分析 | 数据分析 | 2020/3/16 11:00 | 余杭区 | 37500 | 1-3年 | 全职 | 本科 | 五险一金、弹性工作、带薪年假、年度体检 | today | 233 | 15.101875 | False | ‘定期体检’ |
0 | 数据分析 | 50-150人 | 移动互联网,电商 | A轮 | [‘绩效奖金’, ‘带薪年假’, ‘定期体检’, ‘弹性工作’] | 产品|需求|项目类 | 数据分析 | 数据分析 | 2020/3/16 11:00 | 余杭区 | 37500 | 1-3年 | 全职 | 本科 | 五险一金、弹性工作、带薪年假、年度体检 | today | 233 | 15.101875 | False | ‘弹性工作’ |
1 | 数据建模 | 150-500人 | 电商 | B轮 | [‘年终奖金’, ‘做五休二’, ‘六险一金’, ‘子女福利’] | 开发|测试|运维类 | 数据开发 | 建模 | 2020/3/16 11:08 | 滨江区 | 15000 | 3-5年 | 全职 | 本科 | 六险一金,定期体检,丰厚年终 | disabled | 176 | 32.559414 | False | ‘年终奖金’ |
1 | ''' |
- 查看数据信息
1 | # 查看数据行列数 |
- 查看统计数据
1 | # 查看数据行列数 |
- 查询
1 | # 查询 |
- 查询类型
1 | df4.select_dtypes(include=['int','float64']) |
- 数据展开
1 | # 如果行A和行C存在[a,b,c]这样的列表,我们可以用 |
- 数据累加
1 | df[list('ABCD')].cumsum() |
- 按时间进行筛选
1 | ''' |
- 排序问题
1 | df = pd.DataFrame({'A':[1,1,2,2,3,3],'B':[2,1,5,6,7,9]}) |
- 对df进行自定义排序
1 | ''' |
保存文件
1 | # 不保存索引 |
Tricks
- 异常值分析
1 | # 先看数据,后面na_values后期填写 |
- 数据分析&处理
1 | # isnull() is an alias for isna |
- 哑变量操作
1 | ''' |
- 统计空值
1 | # 使用apply实现 |
- 计算最近的数
1 | # 通过abs来计算距离,然后通过sort_values来算最小的数 |
matplotlib
1 | fig,axis = plt.subplots(figsize=(10,8)) |
Tips
屏蔽提醒
1 | import warnings |
显示中文
1 | # win设置中文 |
关于iloc和[]选择赋值失败问题
1 | df['2018-07']['a'] 取出数字,不能赋值 |
- Jupyter
1 | np.add? # 显示帮助 |