pandas数据处理(一)---常用方法

pandas数据处理 一、数据类型 pandas包含两种数据类型:series和dataframe。
1、dataframe 二维数据结构,表格形式,多行多列
每一列可以实不同的值类型(数值、字符串、布尔值等)
行索引:index; 列名:columns
df.dtypes:查看每列的数据类型
查询一行或者一列:Series df.loc[index]
查询多行多列:DataFrame df.loc[index:index+n]

df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})

df.index:数据的索引
df.columns:数据的列名
pandas数据处理(一)---常用方法
文章图片

1、 Series 一维数据结构,每一个元素都带有一个索引,与一维数组的含义相似,其中索引可以为数字或字符串。
DataFrame的一行或者一列就是Series类型
df1 = pd.Series([1.1, 2.2, 3.3],index=['i1', 'i2','i3'])

pandas数据处理(一)---常用方法
文章图片

二、基本操作
1、读入、保存数据 pandas数据处理(一)---常用方法
文章图片

读取纯文本文件
(1) 读入数据 read_csv
# 以BeiJing PM2.5数据为例 import pandas as pd file_path = 'pm25_data_2010.1.1-2014.12.31.csv' data = https://www.it610.com/article/pd.read_csv(file_path) print(data.index,data.columns,data.shape)#查看索引 列名 数据形状 print(data) #输出结果:原数据 Noyearmonthdayhourpm2.5...TEMPPREScbwdIwsIsIr 12010110NaN... -11.01021.001.7900 22010111NaN... -12.01020.004.9200 ..................................... 4382320141231228.0...-4.01034.00246.7200 43824201412312312.0...-3.01034.00249.8500 [43824 rows x 12 columns]

(2)读取txt文件 自己指定分隔符sep=“ … … ”和列名names=[… … … ]
data=https://www.it610.com/article/pd.read_csv(file_path,sep="\t",headr=None,names=['time','a1','a2'])

(3)读取excel文件: read_excel()
data=https://www.it610.com/article/pd.read_excel(file_path)

(4)读取mySql数据表:read_sql() 该方法有两个参数:
1、sql语句
2、数据库的连接 connection
import pymysql conn=pymysql.connect( host='127.0.0.1', user='root', password='12345678', database='test', charset='utf8') data=https://www.it610.com/article/pd.read_sql("select * from tableName",con=conn)

(5)保存数据 to_csv()
new_path = 'pm_new_data.csv' usedData.to_csv(new_path, index=False)

2、查询数据
  • df.loc:根据行、列的标签值查询 — 既能查询,又能覆盖写入,推荐
  • df.iloc:根据行列的数字位置查询
  • df.where方法
  • df.query方法
(1) df.head() :查看前5行 (2) df.tail():查看最后5行 (3) 使用单个label值查询数据
#获得单个值 df.loc["2020-12-29", "a1"] #获得一个Series: df.loc["2020-12-29",[ "a1"], "a2"]

(4) 使用值列表批量查询
#获得Series: df.loc[["2020-12-29","2020-12-30", "2020-12-31" ],"a1"] #获得DataFrame: df.loc[["2020-12-29","2020-12-30", "2020-12-31" ], ["a1", "a2" ]]

(5) 使用数值区间进行范围查询 区间既包含开始,也包含结束
#行index按区间 df.loc["2018-12-15" : "2018-12-31" , "a1"] #列index按区间 df.loc["2018-12-31" , "a1" : "a10"] #行和列都按区间查询 df.loc["2018-12-15" : "2018-12-31","a1" : "a10"]

(6) 使用条件表达式查询
#简单条件查询获取列a1数值小于100的所有行 df.loc[ df[" a1"] < 100, :] #df[" a1"] < 100返回true/false #复杂条件查询 df.loc[(da[" a1"] < 100) & (df[" a10"] < 10) & (df["a20"] < 5) & (df["a50"] < 1)]

(7) 调用函数查询
#lambda 函数: df.loc[ lambda df : ( df[" a1"] < = 100 ) & (df["a10"] < 10) ,:] #编写自己的函数 def query_my_data(df): return df.index.str.startwith("2018-12") & df["a1"] == 1 df.loc[query_my_data, : ]

3、行列操作 (1)交换列的位置
cols = list(data) cols.pop(cols.index('No'))# pop()方法删除指定列 cols.insert(len(data),cols.pop(cols.index('pm2.5')))# 将pm2.5插入到最后一列 newData = https://www.it610.com/article/data.loc[:, cols] print("pm2.5") #输出结果:对比原数据,可以看到pm2.5现在被移动到最后一列,其他列依次前移 yearmonthdayhourDEWPTEMPPREScbwdIwsIsIrpm2.5 2010110-21 -11.01021.001.7900NaN 2010111-21 -12.01020.004.9200NaN 2010112-21 -11.01019.006.7100NaN .................................. 2014123121-22-3.01034.00242.700010.0 2014123122-22-4.01034.00246.72008.0 2014123123-21-3.01034.00249.850012.0 [43824 rows x 12 columns]

4、处理缺省值NaN (1)判断是否存在NaN notnull() isnull()
print(pd.notnull(data))# pd.isnull(data) #data["pm2.5"].notnull() 查看单列的NaN值 #输出结果: 可以看到, PM2.5该列显示False的位置存在NaN值 Noyearmonthdayhourpm2.5...TEMPPREScbwdIwsIsIr TrueTrueTrueTrueTrueFalse...TrueTrueTrueTrueTrueTrue TrueTrueTrueTrueTrueFalse...TrueTrueTrueTrueTrueTrue TrueTrueTrueTrueTrueFalse...TrueTrueTrueTrueTrueTrue ....................................... TrueTrueTrueTrueTrueTrue...TrueTrueTrueTrueTrueTrue TrueTrueTrueTrueTrueTrue...TrueTrueTrueTrueTrueTrue [43824 rows x 12 columns]

(2)删除含有NaN的行/列 dropna()
noNaN = data.dropna(how='any',axis=0, inplace=True) #axis=0 删除该行axis=1 删除该列inplace=True:修改源数据 print(noNaN) #输出结果:对比原数据,含有NaN的1、2等行均被删除 Noyearmonthdayhourpm2.5...TEMPPREScbwdIwsIsIr 252010120129.0...-4.01020.031.7900 262010121148.0...-4.01020.032.6800 ..................................... 4382320141231228.0...-4.01034.00246.7200 43824201412312312.0...-3.01034.00249.8500 [43824 rows x 12 columns]

(3)将NaN设置为指定值 *fillna() *
meanNaN = data.fillna(value = https://www.it610.com/article/newData.mean()['pm2.5']) # data.loc[:, "pm2.5"] = data["pm2.5"].fillna(method="ffill") # method="ffill" : #用前面的非空值来填充 print(meanData) #输出结果:对比原数据,NaN都被赋值为pm2.5的平均值: 98.613215 Noyearmonthdayhourpm2.5...TEMPPREScbwdIwsIsIr 1201011098.613215... -11.01021.001.7900 2201011198.613215... -12.01020.004.9200 3201011298.613215... -11.01019.006.7100 ..................................... 4382320141231228.0...-4.01034.00246.7200 43824201412312312.0...-3.01034.00249.8500 [43824 rows x 12 columns]

5、新增数据列
  • 直接赋值
  • df.apply方法
  • df.assign方法
  • 按条件选择分组分别赋值
(1) 直接赋值
df.loc[: , "max"] = df[" max"].str.replace("; ", ".").astype("float") df.loc[: , "min"] = df[" min"].str.replace("; ", ".").astype("float") df.loc[: , "err"] = df["max"] - df["min"]#增加了一列err

(2) df.apply()
def get_value_type(x): if x["max"] > 100: return "太高" if x["min"] < 10: return "太低" return "正常" df.loc[:, "value_type"] = df.apply(get_value_type, axis=1)#a_type就是新增的列 #查看a_type的计数 df["value_type"].value_counts()

(3) df.assign() 可以同时新增多个列
df.assign( max_type= lambda x : x["max"] * 9 / 5 +32, min_type= lambda x : x["min"] * 9 / 5 +32, )

(4)按照条件选择分组分别赋值 按照条件先选择数据,然后对这部分数据赋值新列
#先创建空列 df["a_typpe"] = " " df.loc[ df["max"] - df["min"] >= 100, "err_type"] = "差距太大" df.loc[ df["max"] - df["min"] <= 10, "err_type"] = "差距太小" #查看err_type的统计值 df["err_type"].value_counts()

6、统计方法
  • 汇总类统计
  • 唯一去重和按值计数
  • 相关系数和协方差
(1) describe 一次性提取出所有数字列的统计结果
df.describe() #能看到每一列数据的count mean std min max 25% 50% 75% max等统计结果

(2) mean() 查看平均值
#以最开始的pm2.5为例 dataMean= data.mean()#计算所有列的平均值(计算时会忽略NaN print(dataMean) #输出结果: No21912.500000 year2012.000000 month6.523549 day15.727820 hour11.500000 pm2.598.613215 DEWP1.817246 TEMP12.448521 PRES1016.447654 cbwd1.488933 Iws23.889140 Is0.052734 Ir0.194916 dtype:float64print(dataMean["pm2.5"])#输出指定列 #输出结果: 98.61321455085375pmMean = data["pm2.5"].mean()#只计算pm2.5列的平均值 print(pmMean) #输出结果: 98.61321455085375

(3) max()、min()、argmax()、argmin() 查看最大/最小值及其位置
dataMax = data.max()#查看所有列的最大值 print(dataMax) #输出结果: No43824.0 year2014.0 month12.0 day31.0 hour23.0 pm2.5994.0 DEWP28.0 TEMP42.0 PRES1046.0 cbwd3.0 Iws585.6 Is27.0 Ir36.0 dtype: float64pmMax = data["pm2.5"].max()#只计算pm2.5列的最大值 pmMaxIndex = data["pm2.5"].argmax()#取最大值位置 print(pmMax ,pmMaxIndex) #输出结果: 994.018049 #min()的用法与max()的用法相同,这里不再赘述

(4)median() 查看中位数
dataMid = newData.median() print(dataMid ) #输出结果: No21912.50 year2012.00 month7.00 day16.00 hour11.50 pm2.572.00 DEWP2.00 TEMP14.00 PRES1016.00 cbwd1.00 Iws5.37 Is0.00 Ir0.00 dtype: float64pmMid = newData["pm2.5"].median()#查看指定列的中位数 print(pmMid) #输出结果: 72.0

(5) unique() 唯一去重和按值计数;获取不重复列表数据;
一般不用于数值列,而是枚举、分类列
uniqueData = https://www.it610.com/article/newData["pm2.5"].unique()#获取不重复的列表数据 print(uniqueData) #输出结果: [ nan 129. 148. 159. 181. 138. 109. 105. ... ... ... ... 2. 3. 577. 483. 519. 551. 542. 580.]

(5) value_counts() 【pandas数据处理(一)---常用方法】按值计数
monthCount = newData["month"].value_counts()

(6) 相关系数和协方差
  • 协方差:衡量同向反向程度;如果协方差为正,说明X Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X Y 反向运动,协方差越小说明反向程度越高;
  • 相关系数:衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,当相关系数为-1时,说明两个变量变化的反向相似度最大;
#协方差矩阵 df.cov() #相关系数矩阵 df.corr() df["max"].corr(df["min"]) df["max"].corr(df["med"] - df["min"])

    推荐阅读