一、简单的构造Series和DataFrame
import pandas as pd dict1 = {'a': 1, 'b': 2, 'd': 3, 'e': 4, 'f': 5} series1 = pd.Series(dict1) print(series1.append(pd.Series({'g': 6}))) # append这种方法就不要用了 # 容器,索引自定义构造,元组和列表效果一样,单一数据类型会重复给索引 # ( data数组, index索引, dtype数据类型会自判断, name名字, copy能否复制) series2 = pd.Series((1, 2, 3), index=['a', 'b', 'c'], name='数组') # 取值的话可以根据自定义的索引或者默认的下标,类似list dict2 = {'sites': ["Google", "Runoob", "Wiki"], 'number': [1, 2, 3]} dataframe1 = pd.DataFrame(dict2) # 构造一个dataframe,也可以以多个series构造 dict3 = {'one': [3, 2, 2], 'two': [1, 2, 3]} dataframe2 = pd.DataFrame(dict3) print(dataframe2.describe()) # describe()可参数为每列统计信息count、mean、标准差、最大最小、四分位值,不指定全出 print(dataframe2.info()) # 行,列,有没有空值,数据类型 print(dataframe2) for i in dataframe2.iterrows(): # 按照1行遍历,返回一个元组包含每行的详细信息 print(i, type(i)) print(dataframe2.T) dataframe3 = pd.DataFrame(dict3, index=['a', 'b', 'c']) # 更换索引 dataframe4 = pd.DataFrame( # 行列二级索引 { ('a', 'a'): {('A', 'B'): 1, ('A', 'C'): 2}, ('a', 'b'): {('A', 'C'): 1, ('A', 'B'): 2}, ('a', 'b'): {('A', 'D'): 1, ('A', 'C'): 2}, } )
二、Series及DataFrame的增删改查
import pandas as pd import numpy as np # 1.1构造一个DataFrame,我从外部导入一个命名df df = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表.csv') # 1.2查看DataFrame的基础信息 print(df.shape) print(df.columns.tolist()) # 把列索引转化成列表,即表头 print(df.index.tolist()) # 把行索引转化成列表,默认从0开始 print(df.dtypes) # 查看每列的数据类型 # 1.31.DataFrame的列查询 print(df['age']) # 直接按照列索引读出年龄列,多列要把列索引放进list中传参 print(df.iloc[:, 0:2]) # 根据下标取列 # 1.32.DataFrame的行查询 print(df[0:1]) # 按照行下标查询类似列表切片 print(df.head(1)) # 从第一行往后读参数个列 print(df.tail(2)) # 从最后一行往前读参数个列 print(df.loc[0]) # 根据下标取行 # 1.33.DataFrame的行列查询df.loc[index, column]或者df.iloc[row_index, column_index]可以是单个参数也可以是列表参数或者条件 # tip.以下是应用的小插曲 print(df.groupby('department')[['age', 'salary']].mean()) # 将将数据聚合到部门内,以此做年龄和薪资的平均数 print(df['department'].value_counts()) # 将部门series单列出来统计不同部门的人员数 print(df['department'].unique()) # 部门列中不重复的内容,用来计算部门个数 # 1.41.DataFrame的改,索引改动 df.rename(index={0: 3, 1: 2, 2: 1, 3: 0}, inplace=True) # 修改索引,不可以用新名字作为列表直接替换 # df.index = [3, 2, 1, 0] # 直接修改行索引 # df.columns = [’column_name‘] # 改一个也要写全部的名字 # mapper是个映射单纯改名字也可以不写,行也类似,axis=0即可 df.rename(mapper={'name': 'Name', 'age': 'Age', 'department': 'Department', # 修改列的名字 'salary': 'Salary', 'id': 'ID'}, axis='columns', inplace=True) # 1.42.DataFrame的改,内容引改动,在行列查找直接复制就行 # 1.5.DataFrame的删除,行删除直接索引,或者axis=0 df.drop(['Age', 'Salary'], axis=1, inplace=True) # inplace默认为True直接改变原表,指定F则不改变,T是动作F相当函数 df.drop(df.columns[[0]], axis=1, inplace=True) # 按照下标删除 # del df['Name'] # 删除Name列 # ndf = df.pop('Department') # 删除列并返回删除值 print(df) # 1.61.DataFrame的列增加,insert()按照下标,直接新索引添加,loc位置下标添加,下标就是默认的数字索引,索引就是列名columns names = np.array(['lily', 'anday', 'lilylucy', 'tomanday']) df.insert(1, 'name', names) # 直接用列表、元组也行就是出黄色警告,insert必须是同种类型 salary = [1000, 2000, 3000, 5000] df['salary'] = salary # 这个和字典比较像,有列名就是替换,没有就是尾部增加 df.loc[:, "sex"] = ['m', 'f', 'm', 'f'] # 按照位置也是一个尾部追加 # 1.62.DataFrame的行增加,必须同类型同列名append()在尾部添加,loc位置下标添加 df1 = pd.DataFrame({'ID': (5, 6), 'name': ('jack', 'tom'), 'Department': ('HR', 'BP'), 'salary': (1000, 8000), 'sex': ('f', 'f')}, index=[7, 8]) df2 = df.append(df1, ignore_index=False) # 这种方式即将被移除ignore_index默认F采用自己下标,T则新生成 df2.loc[9] = [7, 'maico', 'Leader', 1, 'm'] # 下标不同添加,相同则为改变 print(df2)
三、构建时间序列索引
import pandas as pd import numpy as np # 构造时间索引 print('-------------指定个数均匀时间序列:[2020/1/1,2022/10/1]之间均匀产生8个时间点------------') index1 = pd.date_range(start='2020/1/1', end='2022/10/1', periods=8) print(index1) print('-------------在2022/9/1-2022/10/1之间指定固定间隔的时间序列,如果ferq不能均分要指定左闭还是右闭------------') index2 = pd.date_range(start='2022/9/28', end='2022/10/1', freq='15h', inclusive='right') print(index2) print('-------------构造一个[2022/9/28-2022/10/1]时间序列,内容是0-1随机数------------') index3 = pd.date_range(start='2022/9/28', end='2022/10/1', freq='24h') dataframe1 = pd.DataFrame(np.random.rand(4, 3), index=index3, columns=['a', 'b', 'c']) print(dataframe1) print('-------------计算时间间隔[2022/9/28-2022/10/1]之间有几天------------') print(pd.to_datetime('2022/10/1')-pd.to_datetime('2022/9/28')) print('-------------------------获取dataframe1前2行-------------------------------') print(dataframe1[:2])
四、DataFrame的合并
import pandas as pd import numpy as np df = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表1.csv') print(df) print('-----------------------利用bool索引过滤数据----------------------------') print(df[df.age >= 30]) print('-----------------------apply()函数添加辅助列----------------------------') df['薪资标准'] = df.loc[:, 'salary'].apply(lambda x: '>=3k' if x >= 3000 else '<3k') print(df) print('-----------------------利用函数过滤数据----------------------------') print(df[df.department.isna()]) print(df[df.薪资标准.isin(['<3k'])]) # print(df[~df.薪资标准.isin(['<3k'])]) # ~isin()中的取反标志 print(df[df['薪资标准'] == '>=3k']) print('-----------------------内置函数统计计算----------------------------') print(df['salary'].sum(), df['salary'].mean(), df['salary'].max()) print('-----------------------对一列数据进行多项操作,但是匿名函数只能用一次----------------------------') print(df['salary'].transform([lambda x: '>=3k' if x >= 3000 else '<3k', np.abs, np.sqrt])) print('-----------------------这个视频map、apply、transform讲的迷离----------------------------') print(df['salary'].map(lambda x: '>=3k' if x >= 3000 else '<3k')) print(df['salary'].apply(lambda x: '>=3k' if x >= 3000 else '<3k')) print('-----------------------合并contact()函数----------------------------') df1 = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表.csv') df2 = pd.concat([df1, df]) # 默认按照行合并axis=0,不增加二级索引key=[x, y],∪集组合join='outer' print(df2) df3 = pd.concat([df1, df], axis=1, join='inner', keys=['c', 'd']) print(df3) print('-----------------------功能更强大的merge()函数----------------------------') df4 = pd.merge(df1, df, how='outer') # on=[列名, …],how=inner/outer/left/right,validate='one_to_many' # 基于列名的merge,在相同列里,元素相同的∩,how不指定就是inner-right,指定左右就变成了outer了 # validate='one_to_many'一对多 print(df4)