【pandas】模块——DataFrame数据处理(一)

DataFrame-数据创建与导入

下一篇:dataframe数据筛选(二)
下二篇:dataframe高级用法(三)


,红,橙,蓝

一定义


DataFrame是一种表格型的数据结构

姓名类型成绩
0张三高中89
1李四初中90

1.1 特征


  1. 第一行为字段,即列名,从第二行开始为一行一行的记录
  2. 每列可以是不同的值类型(数值/字符串/布尔值等)
  3. 即有行索引也有列索引

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

  1. inner连接(交集)
  • ·pd.merge(df7,df8)·

默认连接方式为交集:若没有指定,则默认将重叠列的列名作为键
新表格的行的数量为按“name”列取交集元素的个数

  • pd.merge(df7,df8,how="inner")

与上一种方式等价,显示指定连接方式

  • pd.merge(df7,df8,on="name")

显现的指定键为“name”列,不同的列名都会保留下来

  1. outer连接(并集)
    pd.merge(df7,df8,on="name",how="outer")

显现的指定键为“name”列,保留两个表的“name”的所有内容,按原来的表格填充,没有内容的返回NaN
新表格的行的数量为按“name”列取并集元素的个数

  1. left连接(保左加右)
    pd.merge(df7,df8,on="name",how="left")

显现的指定键为“name”列,保留左边的表,右边的边进行填充,没有内容的返回NaN
新表格的行的数量为按“name”列取左边表格元素的个数

  1. right连接(保右加左)
    pd.merge(df7,df8,on="name",how="right")

7.2按照两个数据指定的列的列名合并merge

  1. 单对不同列名的匹配
df8=df8.rename(columns={"name":"name2"})  
pd.merge(df7,df8,left_on="name",right_on="name2",how="inner")

7.3 按照多个键来进行合并merge

  1. 按多个列名来匹配
df8["city"]=["hangzhou","hangzhou","heilongjiang"]
pd.merge(df7,df8,on=["name","city"],how="left")  
  1. 将索引作为键来合并

示例数据

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高级用法(三)

这篇笔记主要介绍了Pandas模块的基本操作和使用方法。PandasPython中一个用于数据分析和处理的常用库,提供了高效的数据结构和数据分析工具,是进行数据处理和数据挖掘的重要工具之一。 一、Pandas数据结构 Pandas主要有两种数据结构:Series和DataFrame。 1. Series Series是一种类似于一维数组的对象,由一组数据和一组与之相关的标签(即索引)组成。Series的创建方式如下: ```python import pandas as pd # 通过列表创建Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) # 通过字典创建Series s = pd.Series({'a': 1, 'b': 2, 'c': 3}) ``` 2. DataFrame DataFrame是一种二维表格数据结构,由一组数据和一组行索引和列索引组成。DataFrame的创建方式有很多种,最常用的是通过字典创建。例如: ```python import pandas as pd data = {'name': ['Tom', 'Jerry', 'Mike'], 'age': [18, 20, 22], 'gender': ['M', 'M', 'F']} df = pd.DataFrame(data) ``` 二、Pandas的基本操作 1. 数据读取 Pandas可以读取多种格式的数据文件,如CSV、Excel、SQL等。常用的读取CSV文件的方式如下: ```python import pandas as pd df = pd.read_csv('data.csv') ``` 2. 数据预处理 数据预处理是数据挖掘中非常重要的一部分,Pandas提供了很多方便的函数和方法来进行数据清洗和转换。常用的数据预处理函数和方法有: - 处理缺失值 ```python # 判断是否存在缺失值 df.isnull() # 删除缺失值 df.dropna() # 填充缺失值 df.fillna(value) ``` - 处理重复值 ```python # 删除重复值 df.drop_duplicates() ``` - 数据转换 ```python # 数据类型转换 df.astype() # 数据替换 df.replace() ``` 3. 数据分析 Pandas提供了各种数据分析和处理的方法和函数,常用的包括: - 统计函数 ```python # 计算平均值 df.mean() # 计算标准差 df.std() # 计算最大值和最小值 df.max(), df.min() ``` - 排序 ```python # 按照某列排序 df.sort_values(by='column_name') ``` - 数据聚合 ```python # 对某列数据进行分组求和 df.groupby('column_name').sum() ``` 以上是Pandas模块的基础内容,还有很多高级用法和技巧需要进一步学习和掌握。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值