python进阶5 -- pandas常用操作

    xiaoxiao2022-07-13  169

    pandas创建数据

    创建一个Series

    传递一个list对象来创建一个Series,pandas 会默认创建整型索引

    import pandas as pd import numpy as np s = pd.Series([1,3,5,np.nan,6,8])
    创建DataFrame
    #默认创建整型索引 data = pd.DataFrame(np.random.rand(6,4), columns=list('ABCD')) #创建带有日期索引的dataframe dates = pd.date_range('20190531', periods=6, freq='D') data2 = pd.DataFrame(np.random.rand(6,4), index=dates, columns=list('ABCD')) #使用字典创建dataframe data3 = pd.DataFrame({'A':pd.Timestamp('20190531'), 'B':np.random.randn(3)})
    读csv文件创建dataframe
    data = pd.read_csv('cars1.csv',parse_dates=['date'], sep=',',index_col='date') data.to_csv('test.csv', index=False) na_values = ['NO CLUE', 'N/A', '0'] requests = pd.read_csv('cars1.csv', na_values=na_values)

    read_csv的参数:

    sep:设置分割符,默认为‘,’encoding:数据编码格式parse_dates:解析日期类型数据index_col:设置索引列na_values:将csv中表示NA的值替换为np.nan
    读excel文件创建dataframe
    读文件read_excel的主要参数 pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None, parse_dates=False, na_values=None)

    该函数主要的参数为io、sheetname、header、names、encoding。

    io:excel文件,可以是文件路径、文件网址等sheetname:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型)、none(全部sheet);header:指定数据表的表头,参数可以是int、list of ints,即为索引行数为表头;names:返回指定name的列,参数为array-like对象。encoding:关键字参数,指定以何种编码读取。parse_dates:解析日期数据index_col:索引列 写文件to_excel DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)

    该函数主要参数为:

    excel_writer:写入的目标excel文件,可以是文件路径、ExcelWriter对象;sheet_name:被写入的sheet名称,string类型,默认为’sheet1’;na_rep:缺失值表示,string类型;header:是否写表头信息,布尔或list of string类型,默认为True;index:是否写行号,布尔类型,默认为True;encoding:指定写入编码,string类型。

    pandas查看数据

    data.dtypes #查看各列的数据格式 data.head(3) #查看前3行,默认是前5行 data.tail(3) #查看后3行数据,默认后5行 data.index #查看索引 data.columns #查看dataframe列名 data.values #查看数据值,结果是一个array() data.describe #查看描述性统计 data.T #转置 data.sort_values(by='C', ascending=True) #按值进行排序,默认升序 data.sort_index(axis=1,by=1,ascending=False) #按轴进行排序,默认升序,axis=1是按行,by=1对第一行进行排序 data.sort_index(axis=0,by=‘C’,ascending=False) #按轴进行排序,默认升序,axis=0是按列,by=‘C’对第C列进行排序

    注:使用sort_index()is deprecated,可使用sort_value代替

    pandas选择数据

    data2['A'] #选择A列数据 data2[['A','B']] #取A和B data2[1:3] #用切片取行 data2.loc['2019-05-31':'2019-06-03', 'C':'D'] #用index和列名取数据 data2.iloc[1:3, 2:4] #用行和列来取数据 data2.iloc[[1,3,5],[1,3]] #提取不连续的行和列 data2.iloc[1,1] #第二行第二列 data2.at['2019-05-31','C'] #at取某个值 data2.iat[1,1] #iat取某个值

    注意: 切片形式data2[1:3] 是取第一行和第2行,不包括第三行 data.loc[1:3,'C':'D'] 结果为3x2 data.iloc[1:2, 3:4] 结果为1x1 data[['A','C']] 这样取数据需要两层中括号

    筛选数据

    data[data['C']>0] #筛选C列数据大于0的行 data[(data['B']>0) & data['C']>0.5] #多条件and data[(data['B']>0) | (data['C']>0.5)] #多条件or data[['A','C']][(data['B']>0) | (data['C']>0.5)] #限定列再加条件 data['D'].isin(['0.332','0.7888']) #用isin筛选特定的值,把需要的值放在一个列表中

    pandas增加和删除数据

    data.insert(1,'a',np.random.randn(6)) #第二列插入一列数据a,在原数据上修改 del data['a'] #永久删除一列数据(原数据上修改) data3 = data.drop(['D'],axis=1) #删除D列,原数据不改变,axis=1表示列

    缺失值处理

    data.dropna(how='any') #去掉包含缺失值的行 data.fillna(value=5) #对缺失值进行填充 data.fillna(data['A'], method='pad') #用前一个数据填充,只填充A列 data.fillna(method='bfill'. limit=1) #用后一个数据代替填充,限制填充个数 data.fillna(df.mean()) #用统计值来填充 data.fillna(df.mean()[['A','C']]) #填充固定列 data.interpolate() data.dropna(axis=0) #删除行,axis=1删除列 data3.replace(1,-1) #将data3中的1全部替换为-1 data3.replace({1:-1,2:-2}) #将1替换为-1,2替换为-2 data3.replace([1,2],[-1,-2]) #将1替换为-1,2替换为-2

    fillna() 函数可一次性完成填补功能。它可以利用所在列的均值/众数/中位数来替换该列的缺失数据 更多详情参考:pandas.DataFrame.fillna

    数据分组

    data3 = data.append(data) data3['E'] =[1,2,3,2,2,4,2,4,1,1,2,1] e = data3.groupby('E') for name, group in e: #取group分组之后的值 print(name) print(group) data3['F'] = [1,2,1,2,2,1,2,1,1,1,2,1] f = data1.groupby(['E','F']) for (E,F), group in e: #取group分组之后的值 print(E,F) print(group) data3.groupby('E').mean() #取分组后均值

    groupby的方法:

    函数名说明count分组中非NA的数量sum非NA值的和mean,min,max非NA值的平均值、最小值、最大值mediam,std,var非NA值的算数中位数,标准差、方差prod非NA值的积first,last第一个和最后一个非NA值
    获取分组后的每个分组最大值并进行填充
    #获取以E为分组,在每个分组中F的最大值 data3.groupby(['E'], sort=False)['F'].max() #判断E中分组数据是不是最大值 data4= data3.groupby(['F'])['E'].transform(max) == data3['E'] #用E中分组后的最大值更新数据 data3['E'] = data3.groupby('F')['E'].transform(max)

    注:

    transform(.)函数将groupby之后的数据扩展到与原来数据相同的维度, F为1和2,则data4= data3.groupby(['F'])后为两维数据,用transform(.)后扩展为data3中12维数据transform()函数可以作用于groupby之后的每个组的所有数据,参数为一个函数名,可以自定义,也可以用‘max’,'min'等已经定义好的
    aggregate

    agg的形参是一个函数会对分组后每列都应用这个函数。

    data4 = data3.groupby('F') data4.agg([np.mean, np.std, np.min, np.sum]) #各列用不同的处理函数。需要在agg函数里以字典的形式给出 data4.agg({"A" : np.mean, "B" : np.max})

    agg函数是对列而言的,如果打算对分组后列的数据进行处理可以使用tranform函数

    计数统计

    data.mean() #按列取均值(axis=0) data.mean(axis=1) #按行取均值 data.sum() #按列求和 data.quantile() #分位数函数,默认0.5 data.quantile(0.75) data.describe() data.cumsum() #累加 data.cumprod() #累乘 data.cummin() #最小值 data['A'].value_counts() #对“A”列数据计数

    删除重复数据

    data3.duplicated() #查看是否是重复数据 data3..drop_duplicates() #删除重复数据,原数据不变 data3..drop_duplicates(inplace=True) #原数据修改 data3.drop_duplicates(keep="last") #保留重复出现最后出现的数据可以使用keep参数。

    pandas数据拼接

    concat

    concat函数可以将形参给出的列表里的各个pandas的数据拼接成一个大的数据。

    data6 = pd.concat([data,data]) #index一致 data6 = pd.concat([data,data3]) #index不一致,未匹配上的为NAN data6 = pd.concat([data,data],axis=1) # 指定拼接的轴,默认是列,axis=1为行

    append也可以实现拼接data.append(data,ignore_index=True),不修改原来数据

    merge

    merge函数默认拼接数据是inner join即内连接,merge函数的left join、right join和数据库的表的left join、right join的概念完全匹配

    col1 = "class_name class_id class_lecturer".split() col2 = "class_id stu_id".split() val1 = [["IT", 100, "Wangli"],["CS", 101, "WangMa"],["CAD", 102, "Liping"], ["ME", 103, "Wufang"],["IT", 104, "Xiaomin"]] val2 = [[100, 20181115],[100, 20181116],[101, 20181117],[100, 20181118],[101, 20181119], [200, 20181120]] course = pd.DataFrame(val1, columns = col1) choose = pd.DataFrame(val2, columns = col2) course.merge(choose) course.merge(choose, how = "inner") choose.merge(course, how = "outer") #merge的outer连接方式,未匹配上的用NaN course.merge(choose, how = "left") choose.merge(course, how = "right")

    左连接左表全输出而右表能匹配的输出,匹配不上的填充NaN,同理右连接时“右表”全输出,而左表匹配上输出,匹配不上填充NaN。

    数据库操作

    链接pg数据库

    conn = psycopg2.connect(database=XX',user='X,password='X',host='XX',port='XX') cur = conn.cursor() sql = "XXXX" text = pd.read_sql(sql,conn) for index, data in text.iterrows(): print(index, data)

    可视化

    由此可见在pandas里数据可视化一般经过以下几步:

    通过import 语句引入matplotlib数据可视化模块里的pyplot,即语句import matplotlib.pyplot as plt利用pandas产生或获取组织可视化的数据,例如程序里的rm和tx对数据进行绘制,主要是使用了plot()函数,例如rm.plot()和tx.plot()最后则是数据的显示输出,即plt.show() import numpy as np import pandas as pd import matplotlib.pyplot as plt v = np.random.normal(loc = 10, scale = 1, size = 200) tx = pd.Series(v) tx.index = pd.date_range('2018-12-01', periods = 200, freq = "d") #print "tx", "-" * 20, "\n", tx rm = tx.rolling(window = 5, center = False).std() rm.plot() tx.plot() plt.show()

    直方图Histogram

    import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(111111) v = np.random.randn(200, 3) #print v ind = pd.date_range('2018-12-25', periods = 200) df = pd.DataFrame(v, index = ind, columns = ["A", "B", "C"]) df.hist(bins = 100) plt.show()

    箱图

    import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(111111) v = np.random.randn(200, 3) ind = pd.date_range('2018-12-25', periods = 200) df = pd.DataFrame(v, index = ind, columns = ["A", "B", "C"]) dfc = df.cumsum() dfc.boxplot() plt.show()

    散点图

    scatter函数可以绘制两个变量间的关系即散点图表示因变量随自变量而变化的大致趋势

    import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(111111) v = np.random.randn(200, 3) ind = pd.date_range('2018-12-25', periods = 200) df = pd.DataFrame(v, index = ind, columns = ["A", "B", "C"]) dfc = df.cumsum() plt.scatter(x = df["A"], y = ind) plt.show()

    热力图

    import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import cm np.random.seed(111111) v = np.random.randn(8, 3) #ind = pd.date_range('2018-12-25', periods = 8) ind = range(10,18) df = pd.DataFrame(v, index = ind, columns = ["A", "B", "C"]) dfc = df.cumsum() plt.imshow(dfc, cmap = "hot", interpolation = "none") plt.colorbar() plt.xticks(range(len(dfc.columns)), dfc.columns) plt.yticks(range(len(dfc)), dfc.index) plt.show()

    饼图

    import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import cm df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y']) df.plot(kind='pie', subplots=True, figsize=(8, 4)) plt.show()

    1:Python pandas 读写excel 2:数据处理利器Pandas使用手册 3:pandas学习园

    最新回复(0)