AL算法组——pandas
文章目录
1,简介
pandas库是基于numpy库进行创建,让numpy为中心的应用更为简单,它具有便捷的数据处理能力,独特的数据结构,并且对文件的读取比较方便。并且Pandas主要用来处理类表格数据,NumPy 主要用来处理数值数据。
2,Dateframe创建
-
利用字典直接创建
d = {'one' : [1, 2, 3,4], 'two' : [1, 2, 3, 4]} df = pd.DataFrame(d)
one two
0 1 1
1 2 2
2 3 3
3 4 4 -
利用numpy库
df = pd.DataFrame(np.random.randn(2,3))
0 1 2
0 -0.258509 1.854810 1.372234
1 -0.102846 -1.319339 -0.870309
3,对Dateframe的数据更改和提取
1.索引的设置
1.修改行列索引 (必须整体全部修改,不能单独修改某个索引)
df = pd.DataFrame(np.random.randint(5,size = (3,4)))
df.index = ['a','b','c']
print(df)
通过rename对某行或列修改索引
df.rename(index={},columns={},axis=,inplace=)#1.index和columns不与axis连用
#2.其次index=None不要出现在axis参数的字典前面
2.通过索引读取dateframe的某行某列数据
直接使用行列索引(先列后行)
df = pd.DataFrame(np.random.randint(5,size = (3,4)))
df.columns = ['a','b','c','d']
df.index = ['z','x','c']
2
3结合loc或iloc使用索引对多行多列进行操作(先行后列)
loc 通过索引名称访问
iloc 通过索引下标访问,支持切片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbprCcmJ-1666874901344)(https://gitee.com/sansejindeyihan/images/raw/master/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221024214952.jpg)]
4.合并两个df使用concat()或append(),删除数据行使用drop()
使用concat()函数,可以将多个df合并,并且可以按行或按列合并
concat([df1,df2,df3……],axis=,join='inner'#只合并相同的列'outter')
使用 append() 函数,可以将两个df合并 ,该函数会按行合并。
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
a b
0 1 2
1 3 4
0 5 6
1 7 8
drop(要删除的行或列的索引,axis= 0或1)删除指定列或者行或列(以上如果需要在原数据上直接做更改,需设置参数inplace=True)
5.缺失数据的处理
1.判断数据是否有缺失值
- pd.isnull(df)
- pd.notnull(df)
a = pd.read_excel('pandas.xlsx',names=[1,2,3],header=None)
c = pd.notnull(a)
f = pd.isnull(a)
print(a)
print(f)
print(c)
1 2 3
NaN name age income
0.0 张三 20 1000
1.0 李四 18 2000
2.0 王五 19 3000
1 2 3
NaN False False False
0.0 False False False
1.0 False False False
2.0 False False False
1 2 3
NaN True True True
0.0 True True True
1.0 True True True
2.0 True True True
2.处理NaN
-
删除缺失值 dropna(inplace=False),前提是缺失值的类型必须是np.NaN
a = pd.read_excel('website.xlsx',sheet_name='Sheet2',index_col=0) b = pd.read_excel('website.xlsx',sheet_name='Sheet4',index_col=0) c = pd.DataFrame({'name':['张三','李四','王五','钱六'],'age':[17,18,21,32],'grade':[98,99,79,89],'salary':[2500,3000,5000,4500]},index=['a','b','c','d']) x = pd.concat([b,a],axis=1) print(x.dropna(axis=1,how='all')) print(x.dropna(axis=1,how='any'))
name rank language url name age grade salary
0 编程帮 1.0 PHP www.bianchneg.com NaN NaN NaN NaN
1 c语言中文网 2.0 C c.bianchneg.net NaN NaN NaN NaN
2 微学苑 3.0 PHP www.weixueyuan.com NaN NaN NaN NaN
3 92python 4.0 Python www.92python.com NaN NaN NaN NaN
a NaN NaN NaN NaN 张三 17.0 98.0 2500.0
b NaN NaN NaN NaN 李四 18.0 99.0 3000.0
c NaN NaN NaN NaN 王五 21.0 79.0 5000.0
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, a, b, c] -
替换缺失值 fillna(value,inplace=False)
4.导入导出excel文件
1.导入
b = pd.read_excel('pandas.xlsx',sheet_name= #表示要导入的单元格 ,header=
#为0表示以数据第一行为列名,为1表示以第二行为列名,若文件没有标题行要使用header=None, unicode= #要提取的列名,name=#传入一列类数组类型的数据,用来作为数据的列名)
2.导出
1.导出一个新excel
#创建所要导出的df数据
a = pd.DataFrame({'name': ['编程帮', 'c语言中文网', '微学苑', '92python'],
'rank': [1, 2, 3, 4],
'language': ['PHP', 'C', 'PHP','Python' ],
'url': ['www.bianchneg.com', 'c.bianchneg.net', 'www.weixueyuan.com','www.92python.com' ]})
#创建excel文件对象
b = pd.ExcelWriter('website.xlsx')
#开始导出
a.to_excel(b)
b.save()
c = pd.read_excel('website.xlsx')
print(c)
Unnamed: 0 name rank language url
0 0 编程帮 1 PHP www.bianchneg.com
1 1 c语言中文网 2 C c.bianchneg.net
2 2 微学苑 3 PHP www.weixueyuan.com
3 3 92python 4 Python www.92python.com
2.将数据导入已有的文件中
a = pd.DataFrame({'name':['张三','李四','王五','钱六'],'age':[17,18,21,32],'grade':[98,99,79,89],'salary':[2500,3000,5000,4500]},index=['a','b','c','d'])
with pd.ExcelWriter('website.xlsx',mode='a') as w:#mode=a表示不覆盖原内容
a.to_excel('website.xlsx',sheet_name='Sheet2')
5.导入导出csv文件
- pd.read_csv(‘filepath_or_buffer’, usecols=[]) 读取csv文件数据
- filepath_or_buffer:文件路径
- sep:分隔符,默认为’,’
- usecols:指定读取的列名,列表形式
- df.to_csv(path_or_buf,columns=[],index=True,mode=‘w’) 将数据存储到csv文件中
- path_or_buf:文件存放的路径
- sep:分隔符,默认为’,’
- columns:列,列表形式
- mode:‘w’:重写,‘a’:追加
- header:是否写进列索引值
- index:是否写进行索引,默认True写进行索引,会将行索引变成一列数据
encoding:编码格式,默认为None
6.Pandas描述性统计
描述统计学(descriptive statistics)是一门统计学领域的学科,主要研究如何取得反映客观现象的数据,并以图表形式对所搜集的数据进行处理和显示,最终对数据的规律、特征做出综合性的描述分析。Pandas 库正是对描述统计学知识完美应用的体现,可以说如果没有“描述统计学”作为理论基奠,那么 Pandas 是否存在犹未可知。下列表格对 Pandas 常用的统计学函数做了简单的总结:
示例:以sum为例
d = {'Name':pd.Series(['小明','小亮','小红','小华','老赵','小曹','小陈',
'老李','老王','小冯','小何','老张']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
df = pd.DataFrame(d)
#也可使用sum("columns")或sum(1)
print(df.sum(axis=1))
0 29.23
1 29.24
2 28.98
3 25.56
4 33.20
5 33.60
6 26.80
7 37.78
8 42.98
9 34.80
10 55.10
11 49.65
7.dateframe的分组求和
1.形式:
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=NoDefault.no_default, observed=False, dropna=True)
示例:
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.]})
a = df.groupby(['Animal']).mean()#按照Animal列的值进行分组,分组后的falcon对应的 MaxSpreed是原来falcon对应的MaxSpreed的均值
print(a)
Max Speed
Animal
Falcon 375.0
Parrot 25.0
一行代码生成所有分组求和,求均值等
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.]})
a = df.groupby(by='Animal')['Max Speed'].describe().unstack()
print(a)`
Animal
count Falcon 2.000000
Parrot 2.000000
mean Falcon 375.000000
Parrot 25.000000
std Falcon 7.071068
Parrot 1.414214
min Falcon 370.000000
Parrot 24.000000
25% Falcon 372.500000
Parrot 24.500000
50% Falcon 375.000000
Parrot 25.000000
75% Falcon 377.500000
Parrot 25.500000
max Falcon 380.000000
Parrot 26.000000
dtype: float64
8.日期创建和转化等处理
1.日期创建
rn = pd.date_range('1/1/2011', periods=2, freq='d') #后两个参数分别是时间次数和变化频度
ts= pd.Series(np.random.randn(len(rn)), index=rn)
converted = ts.asfreq('360Min', method='pad') #通过使用asfreq改变频率函数设定每次频率改变可以设定每个时间片都对应一个值
print(rn)
print(ts)
print(converted)
DatetimeIndex([‘2011-01-01’, ‘2011-01-02’], dtype=‘datetime64[ns]’, freq=‘D’)
2011-01-01 2.045450
2011-01-02 -1.102479
Freq: D, dtype: float642011-01-01 00:00:00 2.045450
2011-01-01 06:00:00 2.045450
2011-01-01 12:00:00 2.045450
2011-01-01 18:00:00 2.045450
2011-01-02 00:00:00 -1.102479
Freq: 360T, dtype: float64
3.处理不合法的日期格式
使用to_datetime()
pandas.to_datetime(arg,eerors=‘ignore’,dayfirst=False,yearfirst=False,utc=None,box=Ture,
format=None,exact=Ture,unit=None,infer_datetime_format=False,origin=‘unix’,cache=False)参数说明
arg: 字符串、日期时间、字符串数组
errors:igonre无视错误,raise无效的解析将引发异常,coerce无效解析设置为NaT。
dayrirst: 类型为布尔值,默认False;如果为True,解析第一个为天,例如:01/05/2022,解析为2022-05-01
yearfirst:类型:布尔值,默认False;如果为True,解析第一个为年,例如:22-05-01,解析为2022-05-01
utc: 默认为None,返回utc,即协调时间时间
box: 布尔值,默认为True,返回DatetimeIndex;如果为False,返回值的ndarray.
format :格式化显示时间的格式。字符串,默认值为None**#处理数据大的时候要加上**
exact: 布尔值,默认False.如果为True,则要求格式完全区配;如果为False,则允许格式与目标字符串中的任意位置区配
infer_datetime_format: 默认为False.没有格式,尝试根据第一个日期推断出格式
origin: 默认unix。定义参考日期。数值将解析为单位数。
cache: 默认值为False。设置True启动缓存加速。
示例:
a = pd.DataFrame({'date':['02.01.2013',
'03.01.2013',
'05.01.2013',
'06.01.2013' ,
'90.01.2013']})
a['date_formatted']=pd.to_datetime(a['date'],errors='ignore',format='%m.%y.%d')
print(a)
date date_formatted
0 02.01.2013 02.01.2013
1 03.01.2013 03.01.2013
2 05.01.2013 05.01.2013
3 06.01.2013 06.01.2013
4 90.01.2013 90.01.2013
8. 对某一列数据进行排序
// ascending默认参数为True,表示升序;False表示降序
df=df.sort_values(by='列名',ascending=True)