如果你已经:安装好python
有一点python语言基础
而且没有过系统化的python学习
希望掌握常见的dataframe处理方法
这篇文章将帮助你掌握工作中常用的工作表操作。
文章阅读时间约40min。
1. 导入package:pandas
import pandas as pd
2. 数据读取与保存读取文件
temp = pd.read_excel("file_path",sheet_name= "sheet_name" ) # sheet_name可以缺省
temp_1 = pd.read_csv("file_path",encoding='utf-8') #file_path不可以出现中文;也可以用来读取txt文件;encoding可以缺省
temp_2 = pd.read_csv("file_path",encoding='gbk') #输出文件
# 输出单个文件
temp.to_excel('file_path',index=False) # 通过设置index参数确定是否保留dataframe中的index
temp_1.to_csv('file_path',index=False,encoding='utf-8')输出多个文件到同一个excel中
writer = pd.ExcelWriter('file_path') # 生成一个新的文件
temp_2.to_excel(writer,sheet_name='temp_2') # 保存第一个表格 temp_2
temp_3.to_excel(writer,sheet_name='temp_3') # 保存第二个表格 temp_3
writer.save()创建新的dataframe
# 使用list创建df
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
#通过字典创建df
test_dict = {'A':[np.nan,3,np.nan,np.nan],
'B':[2,4,np.nan,3],
'C':[np.nan,np.nan,np.nan,np.nan],
'D':[0,1,5,4]}
df = pd.DataFrame(test_dict)
3. 数据初步描述
# 查看前几行与后几行
temp.head()
temp.tail()
# 查看df行列数
temp.shape
temp.shape[1] # 单独查看列数
# 查看df各变量描述性统计
temp.describe()
temp.info()
# 查看df列名
temp.columns
4. 数据行列操作
4.1 修改列名
### 修改全部列名
temp.columns = ["col_name1","col_name2",...] #需与temp表列数相同
### 修改部分列名
temp_1 = temp.copy()
temp_1.rename(columns={'Province':'省份'},inplace=True)
### 将表格列名放入list中
cols = temp_1.columns.tolist()
4.2 增减行列增加一列
temp['test'] = 1
#通过原有列简单计算
temp['test2'] = temp['Value'] + temp['test']
#基于原有列增加列
temp['test3'] = temp['Value'].apply(lambda x: '>100' if x>100 else '<=100')
temp[(temp['col_name']> 0) &(temp['col_name']== 0) ,'new_col_name'] = 1基于原有多列增加列
def cal_label(province,value):
if (province in ['北京','上海','广东']) & (value>1000):
return 'High'
elif (province in ['西藏','新疆','海南']) & (value<100):
return 'Low'
else:
return 'Medium'
temp['test4'] = temp.apply(lambda x: cal_label(x['Province'],x['Value']),axis=1)删除行列
temp.drop("row_name",axis=0).head()
temp.drop("col_name",axis=1).head()
del temp["period"]
4.3 行列切片与数据选择简单行切片
## 选取第2-4行
temp[2:5]
## iloc用法:通过行数筛选,eg:选择第4行
temp.iloc[3]
## 选择行index为"2020-01"的行
temp.loc["2020-01"]根据条件做行筛选
1.逻辑判断符号:
- "|" 代表 "or";
- "&" 代表 "and";
- "==" 代表 "等于";
- "~" 代表 "非"
Note:
1. 每个条件之间需要放括号;
2. 不要使用"="作为逻辑判断
## 筛选出col_name列<=3的所有行
temp[temp["col_name1"]<=3]
list(temp["col_name2"][temp["col_name1"]<=3])列切片
temp[['col_name1','col_name2']]
temp.iloc[:,1:3]
## 选择连续行、连续列
temp.iloc[2:5,1:3]
## 选择非连续行、非连续列
temp.iloc[[1,2,4],[1,3]]
## 用冒号表示所有行/所有列
temp.iloc[1:3,:]
temp.iloc[:,1:3]
## 选择某个值
temp.iloc[0,0]
## 条件筛选
temp[temp['Province']=='上海']
temp[temp['Province'].isin(['上海','北京'])] # isin是用list筛选
temp[~(temp['Province'].isin(['上海','北京']))]
5. dataframe相关用法索引:index
temp = temp.reset_index()
temp = temp.set_index(["col_name"])排序:sort
temp = temp.sort_values(by=['Province','Period']).head()
temp = temp.sort_values(by=['Value'],ascending=False).head()去重:drop_duplicates
temp["col_name1"].unique()
## 按某列值去重
temp.drop_duplicates(subset=['Province']).head() #可以添加keep = first类似的参数
## 去重同时保留最大值
temp = temp.sort_values(by=['Province','Value'])
temp.drop_duplicates(subset=['Province'],keep='last').head()空值:dropna/fillna
df.isnull().sum()
#删除缺失值记录
df.dropna(subset=['A','B'], how='all')
#填补缺失值
df.fillna(0)用指定值填充/替换
values ={'col_name1':0,'col_name2':1,'col_name3':2}
df.fillna(value=values)
temp['col_name'].replace('a','A',inplace=True)
temp.head()宽表转长表,长表转宽表
## 长转宽:
temp_pivot = pd.pivot_table(temp, values='Value', # 列变行之后的值
index=['Period'], # 保留的列值
columns=['Province'], # 列变行之后,列名
aggfunc=np.sum).reset_index()
### 长转宽之后转换行名为单一维度
temp_pivot.columns = ["".join((j)) for i,j in temp_pivot.columns]
## 宽转长:
tepm_melt = pd.melt(temp_pivot,
id_vars=['Period'],# 保留的列值
value_vars=['上海', '云南', '内蒙古', '北京', '吉林',
'四川', '天津', '宁夏', '安徽', '山东', '山西', '广东', '广西', '新疆', '江苏', '江西', '河北',
'河南', '浙江', '海南', '湖北', '湖南', '甘肃', '福建', '西藏', '贵州', '辽宁', '重庆', '陕西',
'青海', '黑龙江'],# 转换为列值
var_name='Province',# 列名
value_name='value')
6. 值统计
6.1 统计值
temp.loc["max"] = temp.max(axis=0)
## 针对离散型变量对每个值计数
temp['Province'].value_counts()
## 统计每个值占比
temp['Province'].value_counts(normalize=True)
## 非重复值计数
temp['Province'].nunique()
## 对数值型变量进行基本的描述性统计
temp['Value'].describe()
6.2 数据计算group by
temp_groupby = temp.groupby(['Period','Province'])['Value'].sum().reset_index().sort_values(by=['Period'])
data1['排名'] = data1.groupby(['月份','小区'])['响应率'].rank(ascending=0, method='min')分组排名
temp = temp.groupby(['Period'])['Value'].sum().reset_index().sort_values(by=['Period','Value'])
temp['rank'] = temp['Value'].groupby(temp['Period']).rank(ascending=1,method='dense')
temp.tail(10)
7. 数据合并merge,根据某列匹配两个表格
df1.merge(df2, on = ["key"], how='right')
# 当左右表格键名不一致时使用
df3.merge(df4, left_on='lkey',right_on='rkey')concat
# 需要保证列名/行数相同
## 行连接|列对齐
pd.concat([data1,data2,data3],keys=['data1','data2','data3'])
## 列连接|行对齐
pd.concat([data1,data2,data3],axis =1,keys =['data1','data2','data3'])