Pandas
数据创建
pandas.DataFrame( data, index, columns, dtype, copy) 构造方法
data:一组数据(ndarray、series, map, lists, dict 等类型)
index:索引值,或者可以称为行标签。
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
dtype:数据类型 dtype = int。
copy:拷贝数据,默认为 False。
pd.date_range(‘1/1/2000’, periods=8)
pd.Series(np.random.randn(5), index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’])
pd.DataFrame(np.random.randn(8, 3), index=index,columns=[‘A’, ‘B’, ‘C’])
data1 = [[‘a’,1.0],[‘b’,2.0],[‘c’,3.0],]
df1 = pd.DataFrame(data1,columns=[‘key’,‘value’])
data2 = {‘name’:[‘a1’,‘a2’,‘a3’],‘age’:[12,20,18]}
df2= pd.DataFrame(data2,index =[“class1”,‘class2’,‘class3’])
data3 = [{‘a’:1,‘b’:2,‘c’:3},{‘a’:3,‘b’:5,‘c’:3},{‘a’:3,‘b’:2,}]
df3 = pd.DataFrame(data3,dtype=int)
pd.DataFrame(np.random.randn(6,4), index=dates, columns=list(‘ABCD’))
pd.DataFrame(np.arange(16).reshape(4,4),columns=list(‘abcd’))
list1 = np.arange(‘2021-08-01’, ‘2021-08-06’, dtype=np.datetime64)
df = pd.DataFrame(np.arange(20).reshape(5,4),index = list1,columns=list(‘abcd’))
数据操作
数据显示
- df.head(10)
df.tail(3) - df.index #显示所的索引值
df.columns #显示所有列标签 df.values #显示所有的值 - df.axes #显示行列索引值
- df.describe() #快速统计
count mean std min 25% 50% 75% max
数据排序
数据选择
-
df[‘A’] #按列选择
-
df[0:3] #切片选择行
-
df.loc[dates[0] # 按行选择
-
df.loc[:,[‘A’,‘B’]] #选择AB列
-
dates = pd.date_range(‘20170101’, periods=6) # 选择索引指定的AB部分断面
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list(‘ABCD’))
print(df.loc[‘20170102’:‘20170104’,[‘A’,‘B’]])
-
df.loc[‘20170102’,[‘A’,‘B’] #仅选择索引指定的AB列
-
df.iloc[3] #指定行数
-
df.iloc[3:5,0:2] #指定切片的行范围(3:5)及所需切片的列(AB)
-
df.iloc[[1,2,4],[0,2]#指定切片的行范围(1,2,4)及所需切片的列(AC)
-
df.iloc[1:3,:]
-
df.iloc[1,1] #第一行第一列
-
df[df.A > 0 # 输出所A列都大于0的行
-
df[df > 0] #输出所有大于0的值,如小于0则以NAN取代,shape保持不变
-
df2[df2[‘E’].isin([‘two’,‘four’])] #df2[‘E’]中包含two 和four值的行
索引操作
- set_index #用于将df中的一行或多行设置为索引
df.set_index([‘one’],drop=False)
df.set_index([‘one’,‘two’]) # 设置多索引
参数drop默认为True,意为将该列设置为索引后从数据中删除,如果设为False,将继续在数据中保留该行 - reset_index 用于将索引还原成默认值,即从0开始步长为1的数组。 df.reset_index(drop=True)
参数drop默认值为False,意为将原来的索引做为数据列保留,如果设为True,原来的索引会直接删除 - 如果要设置的索引不在数据中,可以通过df.index=[‘a’,‘b’,‘c’,‘d’]
数据赋值
-
按列赋值
- list = [1,3,5,7,9] df[‘A’] = list df[‘B’] = 0 修改A列或B列的数值
-
按行赋值
- df.loc[3]=list df.loc[6]=0 修改整行的数值
-
多行多列赋值
- df.loc[[row1,row2],[col1,col2]]=value/valueList
df.iloc[[rowNo1,rowNo2],[colNo1,colNo2]]=value/valueList
增删改查
-
按行增加
- df.loc[‘2021-08-06’] = 0 如果索引值存在则修改数值,如果该索引不存在则增加该该行数据
-
插入数据
- df.insert(4,‘e’,[2,3,4,5,6]) # 在第4列插入列名为’e’,数据为[2,3,4,5,6] 数据需与原数组匹配
-
连接数据
- pd.concat(objs,axis=0,join=‘outer’,join_axes=None,ignore_index=False)
objs 一个序列或者是Series、DataFrame对象。
axis 表示在哪个轴方向上(行或者列)进行连接操作,默认 axis=0 表示行方向。
join 指定连接方式,取值为{“inner”,“outer”},默认为 outer 表示取并集,inner代表取交集。
ignore_index 布尔值参数,默认为 False,如果为 True,表示不在连接的轴上使用索引。
join_axes 表示索引对象的列表。 - pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=(‘_x’, ‘_y’), copy=True)
left/right 两个不同的 DataFrame 对象。
on 指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以
两个 DataFrame 的列名交集做为连接键。
left_on 指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
right_on 指定左侧 DataFrame 中作连接键的列名。
left_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层
索引(MultiIndex),则层的数量必须与连接键的数量相等。
right_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
how 要执行的合并类型,从 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默认为“inner”内连接。
sort 布尔值参数,默认为True,它会将合并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。
suffixes 字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为(‘_x’,‘_y’)。
copy 默认为 True,表示对数据进行复制 - append语法:DataFrame.append(other, ignore_index=False)¶
append只有按行合并,没有按列合并,相当于concat按行的简写形式。
other:单个dataframe、series、dict,或者列表。
ignore_index:是否忽略掉原来的数据索引。
-
删除数据
df.pop(‘A’) #删除A列
- df.drop(‘index_name’) #删除行
df.drop(2) #删除第2行
- df.drop(df.index, inplace=True) #清空数据
df=df.drop(index=df.index) #清空数据
- df.drop_duplicates() #删除重复数据
-
重置标签
-
重置行列标签
- df1 = df.reindex(index=[‘1’,‘2’],columns=[‘A’,'B,‘C’])
-
重命名行列标签
- df1 = df.rename(columns={‘A’:‘a’,‘B’:‘b’},index={‘1’:“0”})
-
数据清洗
- df3.isnull().sum() 每一列中空值的数量
df3.isnull().sum().sum() 整个dataframe表中空值的总数 - df3.count(axis=1) 每一行中非空值的数量
df3.count(axis=0) 每一列中非空值的数量 - dropna(how, axis, subset,inplace ) 删除空值
how:how=‘any’ 如果某一行或某一列里任何一个数据有空值就删除;how=‘all’ 如果某一行或某一列里所有数据都是空值就删除。
axis:axis=0 逢空值剔除整行;axis=1 逢空值剔除列。
subset:指定列。如果是多个列,用list传递参数。
添加inplace = True 参数,才能修改源数据 - df3.fillna(value=0) # 用value参数替换空值
- df3[“年龄”].fillna(value=df3[“年龄”].mean(), inplace=True) # 用均值填补空值
df3[“年龄”].fillna(value=df3[“年龄”].median(), inplace=True) # 用中位数填补空值
df3[“年龄”].fillna(value=df3[“年龄”].mode()[0], inplace=True) # 用众数填补空值 - df3.fillna(method=‘ffill’, axis=0) # 将空值替换成上一行的值
- df3.fillna(method=‘backfill’, axis=1) # 将空值替换成下一列值
数据存储
read_csv()
- pd.read_csv(filepath_or_buffer,header,parse_dates,index_col
- sep:读取csv文件时指定的分隔符,默认为逗号
header:将⾏号⽤作列名,且是数据的开头
header=0表⽰第⼀⾏是数据⽽不是⽂件的第⼀⾏
header=None,即指认为原始⽂件数据没有列索引,这样read_csv为其⾃动加上列索引{从0开始}
names 没有被赋值,header 也没赋值: 这种情况下,header为0,即选取文件的第一行作为表头
names 没有被赋值,header 被赋值:不指定names,指定header为1,则选取第二行当做表头,第二行下面为数据 csv
**文件有表头并且是第一行,那么names和header都无需指定;
**csv文件有表头、但表头不是第一行,可能从下面几行开始才是真正的表头和数据,这个时候指定header即可;
**csv文件没有表头,全部是纯数据,那么我们可以通过names手动生成表头;
**csv文件有表头、但是这个表头你不想用,这个时候同时指定names和header。先用header选出表头和数据,然
后再用names将表头替换掉,就等价于将数据读取进来之后再对列名进行rename;
index_col:读取文件之后所得到的DataFrame的索引,index_col=“name”,将真实的某列当做index(列的数⽬,甚⾄列名)
除了指定单个列,还可以指定多列作为索引
usecols:如果一个数据集中有很多列, 读取的时候只想要使用到的列
dtype:在读取数据的时候,设定字段的类型 dtype={“id”: str}
na_values:该参数可以配置哪些值需要处理成 NaN: na_values=[“对”, “错”] na_values={“name”: [“错”, “"], “result”: [“对”]} parse_dates:指定某些列为时间类型,这个参数一般搭配date_parser使用。
date_parser:是用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式
parse_dates=[“date”], date_parser=lambda x: datetime.strptime(x, “%Y年%m月%d日”))
to_csv
- DataFrame.to_csv(path_or_buf=None, sep=‘,’, na_rep=‘’, float_format=None, columns=None, header=True, index=True,
index_label=None, mode=‘w’, encoding=None, compression=‘infer’, quoting=None, quotechar=‘"’, line_terminator=None, chunksize=None,
date_format=None, doublequote=True, escapechar=None, decimal=‘.’, errors=‘strict’) - path_or_buf 字符串或⽂件句柄 默认⽆⽂件路径或对象,如果没有提供,结果将返回为字符串。
sep 分隔符,sep=‘?’ 使用” ?“分隔,默认值是“ ,”来分隔数据
na_rep 替换空值,na_rep=‘NA’,如果不写则为空值
float_format 保留数据格式,默认为 None ,float_format=‘%.2f’ 保留2位小数值
columns 要写⼊的字段列表,columns=[‘name’,‘age’] 写入name和age列
header 默认为true,写入列名。如果给定字符串列表,则作为列名的别名,否则不写入列名
index 布尔值,默认为Ture, 保留行索引 index
index_label 字符串或序列,或False,默认为None,如果需要,可以使⽤索引列的列标签。如果没有给出,且标题和索引为True,
则使⽤索引名称。如果数据⽂件使⽤多索引,则应该使⽤这个序列。如果值为False,不打印索引字段。 mode 字符串,默认为"w" ,r : 只能读, 文件必须存在, w : 只能写, 文件不存在可以创建,文件重头写入 a : 只能写, 文件可以
创建,仅在原文件结尾追加写 r+ : 可读可写, 必须存在, 可在任意位置读写 w+ : 可读可写, 可创建,重头写入 encoding 编码格式,表⽰在输出⽂件中使⽤的编码的字符串,Python3默认为“UTF-8”。
compression 输出⽂件中使⽤的压缩的字符串,允许值为“gzip”、“bz2”、“xz”,仅在第⼀个参数是⽂件名时使⽤
line_terminator 默认为 ‘n’ ,在输出⽂件中使⽤的换⾏字符或字符序列。默认为os.linesep,这取决于调⽤此⽅法的操作系统
(例如, 对于linux为“n”,对于Windows为“rn”)
date_format ⽇期时间对象的格式字符串