DataFrame-数据创建与导入
下一篇:dataframe数据筛选(二)
下二篇:dataframe高级用法(三)
,红,橙,蓝
一定义
DataFrame是一种表格型的数据结构
姓名 | 类型 | 成绩 | |
---|---|---|---|
0 | 张三 | 高中 | 89 |
1 | 李四 | 初中 | 90 |
1.1 特征
- 第一行为字段,即列名,从第二行开始为一行一行的记录
- 每列可以是不同的值类型(数值/字符串/布尔值等)
- 即有行索引也有列索引
1.2 获得DataFrame的两种方式
A. 自己创建DateFrame
A.1 通过字典的方式创建DataFrame
- 通过单层字典创建
- 通过嵌套字典创建
import pandas as pd
df=pd.DataFrame({'a':[1,3,3,4],'b':[2,3,6,7],'c':[10,2,3,4]})
df
注意
- arange(12):其实和arange()差不多,只不过arange是在数组意义上的快速生成数列的方法
- reshape(3,4):将数组对象按照3行4列的方式排列
- index:索引
- columns:列名
A.2 在表格中取列并生成新的表格
- 索引为字符串 d3=df[[‘站点编号’,‘借车总量’,‘还车总量’]]
- 索引为数字 df[[1,2,3]]
B .从外部导入dataframe
- 导入csv文件 .对于windows系统,在导入数据时可能会遇到一些编码问题,添加参数encoding='gbk’就可以解决大部分情况了
- 导入的文件必须存放在python的当前的路径中
- 如果导入无中文的文件,输入文件名名称即可
- 如果文件中包含中文,则添加encoding=‘gbk’
对于Excel文件的处理办法
- 将原来的文件转化成csv
- df3=pd.read_excel(“名字.xlsx”),中文的话继续加参数
1.3.导出csv文件
df2.to_csv(“111导.csv”)
二、 数据检查
2.1 查考表头和表尾
.head()查看表头(前几行)
.tall()查看表尾(后几行)
2.2查看列名
.columns
2.3 查看索引
.index
2.4查看行列数
.shape 返回行和列的个数
2.5查看数据类型
.dtype
- df.dtypes查看某表格的数据类型
- df[“yanse”].dtype查看某列的数据类型
2.6查看空值
.isnull()
- df.isnull()判断表格的是否具有缺失值,False代表无,True代表有
- df[df["颜色区分“].isnull()]返回“颜色区分”这一列中数值缺失的表格的行
2.7查看数据表的信息
.info()
2.8查看唯一值
.unique()
info(self, verbose=None, buf=None, max_cols=None, memory_usage=None, null_counts=None)
- verbose:是否打印全部summary
- buf:
- max_cols:何时从详细输出切换到截断输出
- memory_usage:指定DataFrame的总内存使用量应显示元素(包括索引)
- null_counts:
- df["颜色区分“].unique()查看某列中的唯一值
- 所有唯一值的数量 len(df[“颜色区分”].unique())
- 每个值出现的次数(频次) df[“颜色区分”].value_counts()
三、 数据清洗
创建一个4行3列的含有NaN的数据作为演示
3.1缺失值处理
3.1.1判断是否是缺失值
.isnull()
- df.isnull()判断数据表中是否有缺失值
- df[“借车总量”].isnull()判断列中是否有缺失值
- df_m[“还车总量”].isnull().value_counts()查看这一列的非缺失值和缺失值的数量分布
3.1.2缺失值删除
.dropna()
- 默认删除掉含有缺失值的所有行,与.dropna(how=“any”)等价
- .dropna(how=“all”)删除满足行内数据均为NaN这个条件的行
- .dropna(how=“all”,axis=1)删除掉列内均为NaN这个条件,按列删除,会返回一个新的数据表格,
- .dropna(how=“all”,axis=1,inplace=True)如果想要在原表格上操作,加inplace=True参数
3.1.3填充缺失值
.fillna()
- .fillna(value=0,inplace=True)填充指定值,同理inplace函数是在原表格上进行操作
- .fillna(df[1].mean()),填充函数:采用平均值填充
- .fillna(method=“ffill”)向前填充
- .fillna(method=“bfill”) 向后填充
== 创建含有空格的示例数据==
dict1={“name”:[“小红”,“小明”,“小张”],“age”:[16,17,18],“city”:["北京 “,”杭州“,”上海 “]}
3.2清楚空格
.map(str.strip)
- dic[“city”]=dic[“city”].map(str.strip)清除“city”列的空格并赋值
3.3转换数据格式
3.3.1 查看数据类型:
df.dtypes
3.3.2 转换数据类型
df.astype ()
-
.astype("str")
转换成字符串格式 -
.astype("float")
转换成浮点数格式 -
dic["age"]=dic["age"].astype("float")
-
.astype("int")
转化成整数格式
3.4大小写转换
-
.str.upper()
dic["city"]=dic["city"].str.upper()
:转换成大写 -
.str.lower()
dic["city"]=dic["city"].str.lower()
转换成小写 -
.str.title()
dic["city"]=dic["city"].str.title()
转换成首字母大写
3.5更改列名
.rename()
dic.rename(columns={“name”:“name2”,“age”:“age2”},inplace=True)
通过rename函数更改部分或者所有列名,并默认返回一个新的数据框,若在原表基础上修改则添加参数inplace=True即可
.columns
dic.columns=[“n”,“a”,“c”]
通过columns属性修改列名,这种方式需要输入所有的列名,并直接在原基础上修改
3.6更改索引
.set_index()
set_index(self, keys, drop=True, append=False, inplace=False)
:
keys为标签或者标签列表
drop=True:删除原索引,inplace=True在原表操作
df.set_index(['year', 'month'])
dic1=dic.set_index(“n”)以某列为索引
将“n”这一列作为索引,同时发现原来默认的数字索引没了,且新的表格少了一列
.reset_index()
dic2=dic1.reset_index()重置 索引
df.reset_index(drop=True,inplace=True)
:drop=True,是将原索引删除再重置新索引,inplace=True是在原DF上修改
四、 重复值处理
创建含重复值数据
df5=pd.DataFrame({"c1":["apple"]*3+["banana"]*3,"c2":[1,1,2,3,3,2]})
4.1查看是否有重复值
.duplicated()
df5.duplicated(subset=["c1","c2"],keep="first")
subset是判断基准,以“c1","c2"联合起来判断是否有重复值
keep保留,“first”保留第一个出现的重复值,即第一个出现的不为重复值,第二个出现的才为重复值df5_duplicated.value_counts()
当数据量较大是可以查看重复数值和非重复数值分布
4.2保留重复值
df5[df5.duplicated(subset=["c1","c2"],keep="first")]
df5[]中的是返回的布尔值,直接提取出来即可
4.3删除重复值
.drop_duplicates()
df5.drop_duplicates(subset=["c1","c2"],keep="first")
默认保留第一个出现的重复值,删除掉后面的重复值df5.drop_duplicates(subset=["c1","c2"],keep="last")
保留最后一个重复值,删除掉前面的重复值- 希望在原基础上修改,则添加参数inplace=True
五、替换值
忽略警告的做法
import warnings #导入包
warnings.filterwarning(“ignore”)
.replace()
df6["产品1"]=df6["产品1"].replace("a","bb")
单个对象替换单个值df6["产品1"]=df6["产品1"].replace(["c","d"],"gg")
多个对象替换单个值df6["产品1"]=df6["产品1"].replace(["f","gg"],["f_s","gs"])
多个对象替换多个值df6["产品1"]=df6["产品1"].replace({"f_s":"fs","gs":"ggs"})
参数为字典的方式
六、数据的增删改
6.1 增加行
.loc
df7.loc[5]=["baby","shanghai",80]
#.loc[]通过行索引来取得数值
.iloc[]
通过行号来取行数据
.append()
df7.append(df8)
在列名相同的情况下,直接添加行上去,索引号不会直接顺接上去
df7.append(df8,ignore_index=True)
忽略掉原来的索引,索引可以顺接了
pd.concat
pd.concat([df7,df8],ignore_index=True)
拼接相同字段,顺接
6.2删除行
.drop()
df9.drop(6,inplace=True)
按索引行号删除行,6即删除第7行
df9.drop([3,5])
删除多行
6.3修改行
.loc
df7.loc[0]=["daseen","hangzhou",35]
按单行修改,在原表上修改
df7.loc[0:2]=[["a","b","c"],["d","e","f"],[1,2,3]]
按多行修改,多行用方括号扩起来
6.4增加列
- 按列索引在列末尾增加列
df7["gender"]=["male","male","female","female","male"]
列中的数量必须相同或方括号中的元素数量必须与原表中的行数相同
.insert
任意列位置插列
df7.insert(1,"heigh",[170,168,175,180,179])
在第2列插入列名为“heigh”的一列
1->代表位置,列名,值
方括号中的元素数量必须与原表中的行数相同
6.5删除列
del DataFrame[colnane]
del df7[“score”]
.drop(["列名"],axis=1)
df7.drop(["city"],axis=1)
注意,drop删除行或列的时候,默认删除行,要删除列的时候要如上添加参数df7.drop(["city",“age”],axis=1)
删除多列
6.6修改列
- 按单列赋单值
df7["score"]=50
- 按多列修改值
df7[["score","city"]]=[60,["hz","bj","hz","cd","sz"]]
注意方括号的个数
七、数据集合并
7.1按照公有的列表名为“name"进行合并merge
- inner连接(交集)
- ·pd.merge(df7,df8)·
默认连接方式为交集:若没有指定,则默认将重叠列的列名作为键
新表格的行的数量为按“name”列取交集元素的个数
pd.merge(df7,df8,how="inner")
与上一种方式等价,显示指定连接方式
pd.merge(df7,df8,on="name")
显现的指定键为“name”列,不同的列名都会保留下来
- outer连接(并集)
pd.merge(df7,df8,on="name",how="outer")
显现的指定键为“name”列,保留两个表的“name”的所有内容,按原来的表格填充,没有内容的返回NaN
新表格的行的数量为按“name”列取并集元素的个数
- left连接(保左加右)
pd.merge(df7,df8,on="name",how="left")
显现的指定键为“name”列,保留左边的表,右边的边进行填充,没有内容的返回NaN
新表格的行的数量为按“name”列取左边表格元素的个数
- right连接(保右加左)
pd.merge(df7,df8,on="name",how="right")
7.2按照两个数据指定的列的列名合并merge
- 单对不同列名的匹配
df8=df8.rename(columns={"name":"name2"})
pd.merge(df7,df8,left_on="name",right_on="name2",how="inner")
7.3 按照多个键来进行合并merge
- 按多个列名来匹配
df8["city"]=["hangzhou","hangzhou","heilongjiang"]
pd.merge(df7,df8,on=["name","city"],how="left")
- 将索引作为键来合并
示例数据
left1=pd.DatFrame({"key":list("abcd"),"value":range(4)})
right1=pd.DataFrame({"value2":[10,20]},index=["a","b"])
pd.merge(left1,right1,left_on="key",right_index=True,how="inner")
左侧通过键“key",右侧的通过列表的索引
7.4 数据的轴向连接concat
- axis=0
表示在横轴上工作,所谓的横轴也即时行,而行的方向是上下,因此你可以理解为在上下方向执行操作
- axis=1
表示在纵轴上工作,所谓的纵轴也即时行,而行的方向是左右,因此你可以理解为在左右方向执行操作
因此,轴向连接也就是指:当axis=0,将两份数据或者多分数据按照上下方向拼接起来;当axis=1,…左右方向拼接起来.
创建实例数据
df1=pd.DataFrame({"name":["ray","jcack","lucy","bob","candy"],
"city":["hangzhou","beijing","hangzhou","chengdu","suzhou"],
"score":[10,30,20,15,50]},columns=["name","city","score"])
df2=pd.DataFrame({"name":["faker","fizz"],"city":["wenzhou","shanghai"],"score":[55,80]},
columns=["name","city","score"])
df3=pd.DataFrame({"name":["faker","fizz"],"city":["wenzhou","shanghai"],"gender":["male","female"]},
columns={"name","city","gender"} )
7.4.1axis=0数据拼接
pd.concat
横轴的连接,axis=0,concat默认横轴
- 两份数据的字段完全相同的情况
pd.concat([df1,df2],ignore_index=True)
同增加行相同
按照横轴连接df1和df2
- 两份数据字段存在不同的情况下
pd.concat([df1,df3],ignore_index=True)
会得到两份数据的并集,没有的值返回NaN
- 在连接轴上创建一个索引层次
df_concat=pd.concat([df1,df3],keys=["df1","df3"])
当要访问df1和df2时,可以从这个合并的数据集里提取
df_concat.loc["df3"]
访问合并后的df3的数据
df_concat.loc["df3"].loc[1]
访问合并df3中的第2行,
7.4.2纵轴的连接,axis=1
pd.concat([df1,df3],axis=1)
纵轴方向合并df1和df2
7.5 合并重叠数据 combine_first
DataFrame1.combine_first(DataFrame2)
采用data2的数据给data1数据进行打布丁
data1和data2有索引重叠的部分:即level列和score列的前三行,name对于data1中已有数据,则继续用data1的数据,如果data1中缺失的数据,那么对于缺失数据用参数的对象data2的对应值来填充.
八、数据分组
8.1通过条件判断来进行二分组
满足条件的为一组,不满足条件的为另外一组
np.where
- 单条件判断
df4["借车状态"]=np.where(df4["借车总量"]>=50,"多","少")
创建列,用np.where函数进行填充.如果“借车总量”大于50则“多”,否则“少- 多条件判断
df4["站点级别"]=np.where((df4["借车总量"]>=50)&(df4["还车总量"]>=50),"A级","B级")
追加条件的情况
8.2通过条件判断划分为多个组
.loc
- 非条件判断
df4.loc[(df4["借车总量"]>25),"jibie"]="ok"
df4.loc[~(df4["借车总量"]>25),"jibie"]="no ok"
- 划分多组
df4.loc[(df4["借车总量"]>25),"jibie"]="ok"
df4.loc[df4["借车总量"]<25,"jibie"]="no ok"
df4.loc[df4["借车总量"]==25,"jibie"]="nice"
九、数据割分列与合并列
9.11列分割2列
.split
对h&w列的值依次进行分列,并创建数据表df5_split,索引值为df5的索引值,列名为height和weight
df5_split=pd.DataFrame([x.split("-") for x in df5["h&w"]],index=df5.index,columns=["height","weight"])
将分列后的数据表df_split与原df5的数据表进行匹配
df5=pd.merge(df5,df5_split,right_index=True,left_index=True)
9.2合并
.apply
df5["name:score"]=df5["name"]+":"+df5["score"].apply(str)
创建列,赋值,字符与数值不能直接相加,需要用apply将数值转化为字符串
apply可以将一个函数用于DataFrame的所有行或者所有列,也可以应用到DataFrame的一行或者一列
十、排序
10.1根据值来排序 .sort_values()
.sort_values()
sort_values(self, by, axis=0, ascending=True, inplace=False)
:axis=0表示列,ascending=True默认升序,inplace=True表示在原表操作
df5.sort_values(by="score")
默认为升序排列df5.sort_values(by="score",ascending=False)
增加参数,降序排列df5.sort_values(by=["score","height"])
多级升序排序,第一级关键词是“score”,第二级关键词是“height”df5.sort_values(by=["score","height"],ascending=False)
多级降序排序
*df5.sort_values(by=["score","height"],ascending=[False,True])
第一级降序,第二级升序
10.2根据索引来排序 .sort_index()
.sort_index()
df5.sort_index(inplace=True)
升序排列df5.sort_index(inplace=False)
降序排列
10.3排名 .rank()
.rank()
df6["rank"]=df6["还车总量"].rank(ascending=False,method="dense")
中国式排名:值大的排名靠前,值小的排名靠后,如果值一样则占同一个排名位,排名位是连续的,不存在间断
10.4 转置
- 行索引和列索引进行转置添加链接描述
df7=df7.T
下一篇:dataframe数据筛选(二)
下二篇:dataframe高级用法(三)