注:关于pandas的相关问题,若本文未涉及可在下方留言告诉我,我会在文章中进行补充的
Ctrl
+F
可进行全文查找
原文链接:https://mtyjkh.blog.csdn.net/article/details/84752080,欢迎转载
0 安装
pip方式
pip install pandas
Anaconda
conda install pandas
1 文件
1.1 文件读写模式
以CSV文件的读取为例,代码如下
import pandas as pd
#设置只读模式
file_path = os.path.join("test.csv")
data = pd.read_csv(open(file_path,'r',encoding='utf-8'),sep='|')
mode | 描述 |
---|---|
“r” | 打开,只读。文件的指针将会放在文件的开头。这是默认模式 ; |
“w” | 打开,只写。如果该文件已存在则将其覆盖 。如果该文件不存在,创建新文件; |
“a” | 打开,指向文件尾,在已存在文件中追加 ; |
“rb” | 打开一个二进制文件,只读; |
“wb” | 打开一个二进制文件,只写。如果该文件已存在则将其覆盖 。如果该文件不存在,创建新文件; |
“ab” | 打开一个二进制文件,进行追加 ; |
“r+” | 以读/写方式打开一个已存在的文件; |
“w+” | 以读/写方式建立一个新的文本文件。如果该文件已存在则将其覆盖 。如果该文件不存在,创建新文件 ; |
“a+” | 以读/写方式打开一个文件文件进行追加 ; |
“rb+” | 以读/写方式打开一个二进制文件; |
“wb+” | 以读/写方式建立一个新的二进制文件。如果该文件已存在则将其覆盖 。如果该文件不存在,创建新文件 |
“ab+” | 以读/写方式打开一个二进制文件进行追加 ; |
1.2 读取CSV文件
import pandas as pd
import os
file_path = os.path.join("test.csv")
#读取test.csv文件中的A、B列,若不设置usecols参数,默认读取全部数据。
data = pd.read_csv(open(file_path,'r',encoding='utf-8'),sep='|',usecols=["A","B"])
1.3 读取excel文件
excel文件的读取都可以用以下函数来实现
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None,
arse_cols=None,date_parser=None,na_values=None,thousands=None,
convert_float=True,has_index_names=None,converters=None,dtype=None,
true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
参数详解:
io
:excel文件路径;sheetname
:默认是sheetname为0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。header
:指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = None;skiprows
:省略指定行数的数据,比如省略第三行,skiprows=2
;skip_footer
:省略从尾部数的行数据index_col
:指定列为索引列;names
:指定列的名字,传入一个list数据
1.4 读取txt文件
这里使用read_table()
函数。
import pandas as pd
data=pd.read_table('../data/datingTestSet2.txt',sep='\t',header=None)
data.head()
"""
输出:
0 1 2 3
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
"""
函数原型:
pandas.read_table(filepath_or_buffer,sep='\t',delimiter=None,
header='infer',names=None,index_col=None,usecols=None,squeeze=False,
prefix=None,mangle_dupe_cols=True,dtype=None,engine=None,converters=None,
true_values=None,false_values=None,skipinitialspace=False,skiprows=None,
nrows=None,na_values=None,keep_default_na=True,na_filter=True,verbose=False,
skip_blank_lines=True,parse_dates=False,infer_datetime_format=False,
keep_date_col=False,date_parser=None,dayfirst=False,iterator=False,
chunksize=None,compression='infer',thousands=None,decimal=b'.',lineterminator=None,
quotechar='"',quoting=0,escapechar=None,comment=None,encoding=None,dialect=None,
tupleize_cols=None,error_bad_lines=True,warn_bad_lines=True,skipfooter=0,
doublequote=True,delim_whitespace=False,low_memory=True,memory_map=False,
float_precision=None)
常用参数简介:
filepath_or_buffer
:文件路径。sep
:分隔符,默认为\t。header
:用作列名的行号,默认为0(第一行),如果没有header行就应该设置为None。names
:用于结果的列名列表,结合header=None。skiprows
:跳过指定行。na_values
:缺失值处理,na_values= ["null"]
,用null字符替换缺失值。nrows
:定需要读取的行数:nrows = 100
, 指定读取前100行数据。
1.5 读取JSON文件
import pandas as pd
df = pd.read_json('frame.json')
1.6 写入CSV文件
#任意的多组列表
a = [1,2,3]
b = [4,5,6]
#字典中的key值即为csv中的列名
data_dict = {'a_name':a,'b_name':b}
#设置DataFrame中列的排列顺序
#如果无需重命名,columns这一参数可以省略
dataFrame = pd.DataFrame(data_dict, columns=['a_name', 'b_name'])
#将DataFrame存储到csv文件中,index表示是否显示行名,default=True
dataFrame.to_csv("test.csv", index=False, sep='|')
#如果希望在不覆盖原文件内容的情况下将信息写入文件,可以加上mode="a"
dataFrame.to_csv("test.csv", mode="a", index=False,sep='|')
1.7 写入JSON文件
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(4, 4),
index=['onw', 'two', 'three', 'four'],
columns=['A', 'B', 'C', 'D'])
df.to_json('df.json')
2 DataFrame
2.1 获取列名
DataFrame.columns.values.tolist()
2.2 遍历
遍历DataFrame数据。
for index, row in df.iterrows():
print(row["column"])
2.3 合并(concat方法)
谈到DataFrame数据的合并,一般用到的方法有concat、join、merge。
这里就介绍concat方法,以下是函数原型。
pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False)
参数说明 :
objs: series,dataFrame或者是panel构成的序列list。
axis: 需要合并链接的轴,0是行,1是列。
join: 连接的方式 inner,或者outer。
2.3.1 相同字段的表首尾相接
# 现将表构成list,然后在作为concat的输入
frames = [df1, df2, df3]
result = pd.concat(frames)
#重置索引(index),不然后面容易出问题,我曾经因为这个找了一个上午的bug。
df = result.reset_index(drop=True)
![](https://i-blog.csdnimg.cn/blog_migrate/1410df5fb09952eaa24cabced6e2638b.png)
2.3.2 横向表拼接(行对齐)
特别注意: axis=1时,concat()
的拼接是根据df.index来的,index相同的的行进行拼接。
2.3.2.1 axis参数说明
当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并。
result = pd.concat([df1, df4], axis=1)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8c2adf1a3449ca3395d1cdae760338.png)
2.3.2.2 join参数说明
加上join参数的属性,如果为inner
得到的是两表的交集,如果是outer
,得到的是两表的并集。
result = pd.concat([df1, df4], axis=1, join='inner')
![](https://i-blog.csdnimg.cn/blog_migrate/3286c13cc7e75f50d5a428283d80b69a.png)
2.3.2.3 join_axes参数说明
如果有join_axes的参数传入,可以指定根据那个轴来对齐数据
例如根据df1表对齐数据,就会保留指定的df1表的轴,然后将df4的表与之拼接
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
![](https://i-blog.csdnimg.cn/blog_migrate/768a22cd929c0ac5dc520783c2f638ef.png)
2.4 将df按照某个字段进行拆分求和(groupby()函数)
如果我们需要将Datetime值相同的行进行合并(AEP_MW取这些行的和),可以这样做
dataset_new_2 = dataset_new.groupby(by='Datetime')['AEP_MW'].sum()
# 此时得到的dataset_new_2数据类型为Series,可以通过下面代码转化为DataFrame
dict_dataset = {'Datetime':dataset_new_2.index,'AEP_MW':dataset_new_2.values}
dataset_new_3 = pd.DataFrame(dict_dataset)
dataset_new_3.head()
2004/10/1的AEP_MW为所有值的和
3 行列
3.1 查找
查找DataFrame数据类型中的某一(多)行(列)
这里记录三个可以实现该功能的函数:loc
、iloc
、ix
。
- loc:通过标签选取数据,即通过index和columns的值进行选取。loc方法有两个参数,按顺序控制行列选取。
- iloc:通过行号选取数据,即通过数据所在的自然行列数为选取数据。iloc方法也有两个参数,按顺序控制行列选取。
- ix:混合索引,同时通过标签和行号选取数据。ix方法也有两个参数,按顺序控制行列选取。
代码示例如下:
#df数据
a b c
d 0 1 2
e 3 4 5
f 6 7 8
g 9 10 11
3.1.1 loc(按行\列标签进行查找)
通过标签选取数据,即通过index和columns的值进行选取。loc方法有两个参数,按顺序控制行列选取。
#1.定位单行
df.loc['e'] #df数据参考上文
'''
a 3
b 4
c 5
Name: e, dtype: int32
===================================
'''
#2.定位单列
df.loc[:,'a']
'''
d 0
e 3
f 6
g 9
Name: a, dtype: int32
===================================
'''
#3.定位多行
#方法一:
df.loc['e':]
'''
a b c
e 3 4 5
f 6 7 8
g 9 10 11
===================================
'''
#方法二
df.loc[['e','f','g']]
'''
a b c
e 3 4 5
f 6 7 8
g 9 10 11
===================================
'''
#4.定位多行多列
#方法一:
df.loc['e':,:'b']
'''
a b
e 3 4
f 6 7
g 9 10
===================================
'''
#方法二:
df.loc['e':,['a','b']]
'''
a b
e 3 4
f 6 7
g 9 10
===================================
'''
3.1.2 iloc(按行\列号进行查找)
通过行号选取数据,即通过数据所在的自然行列数为选取数据。iloc方法也有两个参数,按顺序控制行列选取。
#1.定位单行
df.iloc[1] #df数据参考上文
'''
a 3
b 4
c 5
Name: e, dtype: int32
===================================
'''
#2.定位单列
df.iloc[:,1]
'''
d 1
e 4
f 7
g 10
Name: b, dtype: int32
===================================
'''
#3.定位多行
df.iloc[1:3] #或者df.iloc[[1,2,3]]
'''
a b c
e 3 4 5
f 6 7 8
===================================
'''
#4.定义多行多列
df.iloc[1:3,1:2]#或者df.iloc[1:3,[1,2]]
'''
b
e 4
f 7
===================================
'''
3.1.3 查找含有特定值的行
import pandas as pd
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
df=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC'))
print(df)
#选取A为4的行
df=df[df['A'].isin([4])]
print(df)
"""
输出
A B C
row0 1 2 3
row1 4 5 6
row2 7 8 9
A B C
row1 4 5 6
"""
3.2 删除
删除DataFrame中某一行
df.drop([16,17])
3.2.1删除特定数值的行
import pandas as pd
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
df=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC'))
print(df)
#通过~取反,选取不包含数字4的行
df=df[~df['A'].isin([4])]
print(df)
"""
输出
A B C
row0 1 2 3
row1 4 5 6
row2 7 8 9
A B C
row0 1 2 3
row2 7 8 9
"""
3.3 修改
3.3.1 修改列名
df.columns = ['A','B','C']
3.4 排序
df.sort_values(by="sales" , ascending=False)
函数原型:
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’)
列举常用的参数用法:
- by:函数的操作对象是DataFrame
- axis:进行操作的列名,多个列名用列表表示
- ascending:默认为升序True
#dataFrame:
'''
col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
3 NaN 8 4
4 D 7 2
5 C 4 3
'''
df = df.sort_values(by=['col1'])
'''
输出:
col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
5 C 4 3
4 D 7 2
3 NaN 8 4
'''
3.5 转置(行列转换)
将dataFrame原先的行变成列,将原先的列变为行
df = df.T
4 索引
-
reindex()
更新index或者columns,
默认:更新index,返回一个新的DataFrame -
set_index()
将DataFrame中的列columns设置成索引index
打造层次化索引的方法 -
reset_index()
将使用set_index()打造的层次化逆向操作
既是取消层次化索引,将索引变回列,并补上最常规的数字索引
详细讲解:
4.1 更新
reindex():更新index或者columns。
默认:更新index,返回一个新的DataFrame。
# 返回一个新的DataFrame,更新index,原来的index会被替代消失
# 如果dataframe中某个索引值不存在,会自动补上NaN
df2 = df1.reindex(['a','b','c','d','e'])
# fill_valuse为原先不存在的索引补上默认值,不再是NaN
df2 = df1.reindex(['a','b','c','d','e'], fill_value=0)
# inplace=Ture,在DataFrame上修改数据,而不是返回一个新的DataFrame
df1.reindex(['a','b','c','d','e'], inplace=Ture)
# reindex不仅可以修改 索引(行),也可以修改列
states = ["columns_a","columns_b","columns_c"]
df2 = df1.reindex( columns=states )
4.2 设置
set_index():将DataFrame中的列columns设置成索引index。
打造层次化索引的方法。
# 将columns中的其中两列:race和sex的值设置索引,race为一级,sex为二级
# inplace=True 在原数据集上修改的
adult.set_index(['race','sex'], inplace = True)
# 默认情况下,设置成索引的列会从DataFrame中移除
# drop=False将其保留下来
adult.set_index(['race','sex'], drop=False)
4.3 重置
reset_index():将使用set_index()打造的层次化逆向操作。
既是取消层次化索引,将索引变回列,并补上最常规的数字索引。
df.reset_index()
5 重复项
5.1 查看是否存在重复项
DataFrame的duplicated方法返回一个布尔型Series,表示各行是否重复行。
a = df.duplicated()
5.2 删除
而 drop_duplicates方法,它用于返回一个移除了重复行的DataFrame
#去掉A_ID和B_ID重复的行,并保留第一次出现的行
df = df.drop_duplicates(subset=['A_ID', 'B_ID'], keep='first')
- 当keep=False时,就是去掉所有的重复行
- 当keep='first’时,就是保留第一次出现的重复行
- 当keep='last’时就是保留最后一次出现的重复行。
6 元素
6.1 查找
通过标签或行号获取某个数值的具体位置(DataFrame数据类型中)
#DataFrame数据
a b c
d 0 1 2
e 3 4 5
f 6 7 8
g 9 10 11
#获取第2行,第3列位置的数据
df.iat[1,2]
Out[205]: 5
#获取f行,a列位置的数据
df.at['f','a']
Out[206]: 6
'''
iat:依据行号定位
at:依旧标签定位
'''
6.2 修改
修改DataFrame中的某一元素
df['列名'][行序号(index)] = "新数据"
7 处理缺损数据
7.1 dropna()方法
该方法用于检查是否存在缺损数据,若存在则删除相关列与行。
函数原型:
pd.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
参数说明:
axis
: 该参数确定是删除包含缺失值的行或列,axis=0
或axis='index’
删除含有缺失值的行,axis=1
或axis='columns’
删除含有缺失值的列。how
:any
存在即nan即丢弃,all
全部为nan才丢弃。thresh
:默认值 None值,thresh=n
则表明每行至少n的非NaN值,否则则删除该行。subset
:定义要在哪些列中查找缺失值。inplace
:默认值 False,是否直接在原DataFrame进行修改。
8 实现数据分组求平均值
#求type1Name下属所有类别名
type1Name = df.type1Name.unique()
#输出每个类别A值的平均值
for type1 in type1Name:
t = df.type1Name.A == type1
print(df[t].mean())