Pandas之DataFrame,快速入门,迅速掌握(一)

简介: Pandas之DataFrame,快速入门,迅速掌握(一)

一、Pandas数据结构Dataframe

1.基本概念及创建

二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值、字符串、布尔值等。


Dataframe中的数据以一个或多个二维块存放,不是列表、字典或一维数组结构。


2.Dataframe 数据结构

Dataframe是一个表格型的数据结构,带有标签的二维数组。

Dataframe带有index(行标签)和columns(列标签)


我们看下Dataframe的参数

data = {'name':['Jack','Tom','Mary'],
        'age':[18,19,20],
       'gender':['m','m','w']}
frame = pd.DataFrame(data)
print(frame)  
print(type(frame))

字典类型转换为DataFrame类型。每个键是一列

print(frame.index,'\n该数据类型为:',type(frame.index))
print(frame.columns,'\n该数据类型为:',type(frame.columns))
print(frame.values,'\n该数据类型为:',type(frame.values))
# 查看数据,数据类型为dataframe
# .index查看行标签
# .columns查看列标签
# .values查看值,数据类型为ndarray

3.DataFrame的创建

(1)Dataframe 创建方法一:由数组/list组成的字典

字典的值列表长度不一致会报错

创建方法:pandas.Dataframe()

data1 = {'a':[1,2,3],
        'b':[3,4,5],
        'c':[5,6,7]}
data2 = {'one':np.random.rand(3),
        'two':np.random.rand(3)}   # 这里如果尝试  'two':np.random.rand(4) 会怎么样?
print(data1)
print(data2)
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)


由数组/list组成的字典 创建Dataframe,columns为字典key,index为默认数字标签

字典的值的长度必须保持一致!如果两列的数据数量不一致,会报错

df1 = pd.DataFrame(data1, columns = ['b','c','a','d'])
print(df1)
df1 = pd.DataFrame(data1, columns = ['b','c'])
print(df1)

columns参数:可以重新指定列的顺序,格式为list,如果现有数据中没有该列(比如’d’),则产生NaN值

如果columns重新指定时候,列的数量可以少于原数据


df2 = pd.DataFrame(data2, index = [‘f1’,‘f2’,‘f3’]) # 这里如果尝试 index = [‘f1’,‘f2’,‘f3’,‘f4’] 会怎么样?

print(df2)

index参数:重新定义index,格式为list,长度必须保持一致

index不一致报错


(2)Dataframe 创建方法二:由Series组成的字典

字典值的长度不一样不会报错

data1 = {'one':pd.Series(np.random.rand(2)),
        'two':pd.Series(np.random.rand(3))}  # 没有设置index的Series
data2 = {'one':pd.Series(np.random.rand(2), index = ['a','b']),
        'two':pd.Series(np.random.rand(3),index = ['a','b','c'])}  # 设置了index的Series
print(data1)
print(data2)
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)

由Seris组成的字典 创建Dataframe,columns为字典key,index为Series的标签(如果Series没有指定标签,则是默认数字标签)

Series可以长度不一样,生成的Dataframe会出现NaN值


(3)Dataframe 创建方法三:通过二维数组直接创建

ar = np.random.rand(9).reshape(3,3)
print(ar)
df1 = pd.DataFrame(ar)
df2 = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['one','two','three'])  # 可以尝试一下index或columns长度不等于已有数组的情况
print(df1)
print(df2)

通过二维数组直接创建Dataframe,得到一样形状的结果数据,如果不指定index和columns,两者均返回默认数字格式

index和colunms指定长度与原数组保持一致


当与原数组行数或列数不一致,会报错

(4)Dataframe 创建方法四:由字典组成的列表 列表套字典

data = [{'one': 1, 'two': 2}, {'one': 5, 'two': 10, 'three': 20}]
print(data)
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data, index = ['a','b'])
df3 = pd.DataFrame(data, columns = ['one','two'])
print(df1)
print(df2)
print(df3)

由字典组成的列表创建Dataframe,columns为字典的key,index不做指定则为默认数组标签

colunms和index参数分别重新指定相应列及行标签

index是重新生成标签名

列表中的字典,键的数量不用相同,每个字典是一行数据,不存在的键默认为NaN

colunms并不是重新设置列名,而是指定已存在的列名。没指定出的列,会丢弃没指定列的值

(5)Dataframe 创建方法五:由字典组成的字典 字典的值也是字典

这种很少见

data = {'Jack':{'math':90,'english':89,'art':78},
       'Marry':{'math':82,'english':95,'art':92},
       'Tom':{'math':78,'english':67}}
df1 = pd.DataFrame(data)
print(df1)
# 由字典组成的字典创建Dataframe,columns为字典的key,index为子字典的key

df2 = pd.DataFrame(data, columns = ['Jack','Tom','Bob'])
df3 = pd.DataFrame(data, index = ['a','b','c'])
print(df2)
print(df3)


columns参数可以增加和减少现有列,如出现新的列,值为NaN

index在这里和之前不同,并不能改变原有index,如果指向新的标签,值为NaN (非常重要!)

4.DataFrame添加数据

1.append

利用append函数向dataframe中添加新的行:


append函数添加的对象可以为dataframe、series、dict、list等数据结构


注意事项:


如果添加的对象含有DataFrame中不含有的列名,则这些列被当做新的列添加!产生的空位将由Nan补上

参数ignore_index默认为False,若为True则生成的新DataFrame的行索引会重新分配,变为从0开始、步长为1的整数序列

当添加的对象为字典型和列表型时,参数ignore_index必须设为True,不然会报错(因为不知道编译器该如何设置它们的行索引)。但注意ignore_index是重新分配行索引,所以可能会改变原DataFrame的行索引,为了避免这种情况的发生可以将字典型或列表型转化为Series后再加入

当添加的对象为Series时,需要为Series的name赋值,Series的索引被视为列索引,name被视为行索引加入DataFrame中

若添加的对象为DataFrame,则相当于两个DataFrame的拼接

2.案例

#用四种方法创建Dataframe

#方法一:字典的值是列表或数组
# dict1 = {"one":[1,2,3,4,5],"two":[2,3,4,5,6],"three":[3,4,5,6,7],"four":[4,5,6,7,8]}


# d1 =pd.DataFrame(dict1,columns=["four","one","three","two"],index=list("abcde"))
# print(d1)


#方法二: 字典的值为Serise,index放在创建Series里面
dict2 = {"one":pd.Series(np.arange(1,6),index=list("abcde")),"two":pd.Series(np.arange(2,7),index=list("abcde")),"three":pd.Series(np.arange(3,8),index=list("abcde")),"four":pd.Series(np.arange(4,9),index=list("abcde"))}
d2 =pd.DataFrame(dict2,columns=["four","one","three","two"])
print(d2)



#方法三:二维数组创建
# ar3 = np.array([[4,1,3,2],[5,2,4,3],[6,3,5,4],[7,4,6,5],[8,5,7,6]])
# d3 = pd.DataFrame(ar3,columns=["four","one","three","two"],index=list("abcde"))
# print(d3)


#方法四:列表套字典方式,需要指定index和coloumns顺序
lst4 = [{"one":1,"two":2,"three":3,"four":4},
        {"one":2,"two":3,"three":4,"four":5},
        {"one":3,"two":4,"three":5,"four":6},
        {"one":4,"two":5,"three":6,"four":7},
        {"one":5,"two":6,"three":7,"four":8}
        ]
d4 = pd.DataFrame(lst4,index=list("abcde"),columns=["four","one","three","two"])

print(d4)

#方法五:字典里面是字典,index为子字典的key。只需要指定columns顺序

dict5 = {"one":{"a":1,"b":2,"c":3,"d":4,"e":5},
         "two":{"a":2,"b":3,"c":4,"d":5,"e":6},
         "three":{"a":3,"b":4,"c":5,"d":6,"e":7},
         "four":{"a":4,"b":5,"c":6,"d":7,"e":8}
         }
d5 = pd.DataFrame(dict5,columns=["four","one","three","two"])
print(d5)


方法五:index为子字典的key

二、Pandas数据结构Dataframe:索引

Dataframe既有行索引也有列索引,可以被看做由Series组成的字典(共用一个索引)

选择列 / 选择行 / 切片 / 布尔判断

1.选择行与列

df = pd.DataFrame(np.random.rand(12).reshape(3,4)*100,
                   index = ['one','two','three'],
                   columns = ['a','b','c','d'])
print(df)

data1 = df['a']      #直接Dataframe['a']里面的字段,默认是选择列。如果指定的列名不存在,会报错
data2 = df[['a','c']]
print(data1,type(data1))
print(data2,type(data2))
print('-----')


按照列名选择列,只选择一列输出Series,选择多列输出Dataframe。选择多列时,指定列名时,列名以列表方式表示

如果里面指定的是行标签,而不是列标签,会报错


选择行:用.loc方法

data3 = df.loc[‘one’] #选择行

data4 = df.loc[[‘one’,‘two’]]

print(data3,type(data3))

print(data4,type(data4))


按照index选择行,只选择一行输出Series,选择多行输出Dataframe

2.细讲

(1)df[] - 选择列

一般用于选择列,也可以选择行

df = pd.DataFrame(np.random.rand(12).reshape(3,4)*100,
                   index = ['one','two','three'],
                   columns = ['a','b','c','d'])
print(df)
print('-----')

data1 = df['a']
data2 = df[['b','c']]  # 尝试输入 data2 = df[['b','c','e']]
print(data1)
print(data2)
# df[]默认选择列,[]中写列名(所以一般数据colunms都会单独指定,不会用默认数字列名,以免和index冲突)
# 单选列为Series,print结果为Series格式
# 多选列为Dataframe,print结果为Dataframe格式

data3 = df[:1]  #切片选择行,不管多少行,输出类型为Dataframe
#data3 = df[0]   #这种报错
#data3 = df['one']
print(data3,type(data3))
# df[]中为数字时,默认选择行,且只能进行切片的选择,不能单独选择(df[0])
# 输出结果为Dataframe,即便只选择一行
# df[]不能通过索引标签名来选择行(df['one'])

# 核心笔记:df[col]一般用于选择列,[]中写列名


(2)df.loc[] - 按index选择行
df1 = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   index = ['one','two','three','four'],
                   columns = ['a','b','c','d'])
df2 = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   columns = ['a','b','c','d'])
print(df1)
print(df2)
print('-----')

data1 = df1.loc['one']
data2 = df2.loc[1]
print(data1)
print(data2)
print('单标签索引\n-----')


单个标签索引,返回Series

当设置索引后,就不能再使用默认的数字索引

data3 = df1.loc[['two','three','five']]
data4 = df2.loc[[3,2,1]]
print(data3)
print(data4)
print('多标签索引\n-----')

多个标签索引,如果标签不存在,则返回NaN

顺序可变

新版的,行标签不存在,会报错

data5 = df1.loc['one':'three']
data6 = df2.loc[1:3]
print(data5)
print(data6)
print('切片索引')

可以做切片对象

末端包含

核心笔记:df.loc[label]主要针对index选择行,同时支持指定index,及默认数字index


(3)df.iloc[] - 按照整数位置(从轴的0到length-1)选择行

类似list的索引,其顺序就是dataframe的整数位置,从0开始计

df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   index = ['one','two','three','four'],
                   columns = ['a','b','c','d'])
print(df)
print('------')

print(df.iloc[0])
print(df.iloc[-1])
#print(df.iloc[4])
print('单位置索引\n-----')

单位置索引

和loc索引不同,不能索引超出数据行数的整数位置

print(df.iloc[[0,2]])
print(df.iloc[[3,2,1]])
print('多位置索引\n-----')
# 多位置索引
# 顺序可变


print(df.iloc[1:3])
print(df.iloc[::2])
print('切片索引')
# 切片索引
# 末端不包含

3.布尔型索引

和Series原理相同

df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   index = ['one','two','three','four'],
                   columns = ['a','b','c','d'])
print(df)
print('------')

b1 = df < 20
print(b1,type(b1))
print(df[b1])  # 也可以书写为 df[df < 20]
print('------')


不做索引则会对数据每个值进行判断

索引结果保留 所有数据:True返回原数据,False返回值为NaN

b2 = df['a'] > 50
print(b2,type(b2))
print(df[b2])  # 也可以书写为 df[df['a'] > 50]
print('------')


(1)单列做判断

索引结果保留 单列判断为True的行数据,包括其他列

(1)单列做判断
索引结果保留 单列判断为True的行数据,包括其他列
在这里插入图片描述

b3 


(2)多列做判断

索引结果保留 所有数据:True返回原数据,False返回值为NaN 没有做判断的列返回NaN

(2)多列做判断
索引结果保留 所有数据:True返回原数据,False返回值为NaN 没有做判断的列返回NaN
在这里插入图片描述

b4 

(3)多行做判断

索引结果保留 所有数据:True返回原数据,False返回值为NaN

(4)多重索引:比如同时索引行和列

# 先选择列再选择行 —— 相当于对于一个数据,先筛选字段,再选择数据量

df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   index = ['one','two','three','four'],
                   columns = ['a','b','c','d'])
print(df)
print('------')

print(df['a'].loc[['one','three']])   # 选择a列的one,three行
print(df[['b','c','d']].iloc[::2])   # 选择b,c,d列的one,three行
print(df[df['a'] < 50].iloc[:2])   # 选择满足判断索引的前两行数据


Pandas之DataFrame,快速入门,迅速掌握(二)https://developer.aliyun.com/article/1496716


相关文章
|
2月前
|
SQL 索引 Python
Pandas中DataFrame合并的几种方法
Pandas中DataFrame合并的几种方法
150 0
|
2天前
|
SQL 数据采集 数据可视化
Pandas 数据结构 - DataFrame
10月更文挑战第26天
14 2
Pandas 数据结构 - DataFrame
|
3月前
|
索引 Python
Pandas学习笔记之Dataframe
Pandas学习笔记之Dataframe
|
3月前
|
数据挖掘 大数据 数据处理
数据分析师的秘密武器:精通Pandas DataFrame合并与连接技巧
【8月更文挑战第22天】在数据分析中,Pandas库的DataFrame提供高效的数据合并与连接功能。本文通过实例展示如何按员工ID合并基本信息与薪资信息,并介绍如何基于多列(如员工ID与部门ID)进行更复杂的连接操作。通过调整`merge`函数的`how`参数(如&#39;inner&#39;、&#39;outer&#39;等),可实现不同类型的连接。此外,还介绍了使用`join`方法根据索引快速连接数据,这对于处理大数据集尤其有用。掌握这些技巧能显著提升数据分析的能力。
63 1
|
3月前
【Pandas+Python】初始化一个全零的Dataframe
初始化一个100*3的0矩阵,变为Dataframe类型,并为每列赋值一个属性。
41 2
|
3月前
|
SQL 数据采集 JSON
Pandas 使用教程 Series、DataFrame
Pandas 使用教程 Series、DataFrame
54 0
|
3月前
|
Python
[pandas]从多个文件中构建dataframe
[pandas]从多个文件中构建dataframe
|
3月前
|
索引 Python
【Pandas】Pandas Dataframe 常用用法
Pandas DataFrame的常用操作示例,包括筛选数据、索引操作、合并DataFrame、设置和排序索引、文本处理、列重命名、处理缺失值、排序以及删除满足特定条件的行等技巧。
56 0
|
3月前
|
Python
【Pandas】Pandas的DataFrame按行插入list数据或者读取一行并存为csv文件
本文提供了使用Pandas库对DataFrame进行操作的示例代码。
161 0
|
4月前
|
存储 数据可视化 数据处理
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。