Pandas(二)--DataFrame结构

DataFrame结构

DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:

表格中数据以行和列形式来表示,其中每一列表示一个属性,而每一行表示一个条目的信息。
下表展示了上述表格中每一列标签所描述数据的数据类型,如下所示:

ColumnType
nameString
ageinteger
genderString
ratingFloat

DataFrame 的每一行数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列标签。因此 DataFrame 其实是从 Series 的基础上演变而来。在数据分析任务中 DataFrame 的应用非常广泛,因为它描述数据的更为清晰、直观。下面对 DataFrame 数据结构的特点做简单地总结,如下所示:

  • DataFrame 每一列的标签值允许使用不同的数据类型;
  • DataFrame 是表格型的数据结构,具有行和列;
  • DataFrame 中的每个数据值都可以被修改。
  • DataFrame 结构的行数、列数允许增加或者删除;
  • DataFrame 有两个方向的标签轴,分别是行标签和列标签;
  • DataFrame 可以对行和列执行算术运算。

创建DataFrame对象

创建 DataFrame 对象的语法格式如下:

  1. import pandas as pd
  2. pd.DataFrame( data, index, columns, dtype, copy)

参数说明:

参数名称说明
data输入的数据,可以是 ndarray,series,list,dict,标量以及一个 DataFrame。
index行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。
columns列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。
dtypedtype表示每一列的数据类型。
copy默认为 False,表示复制数据 data。

Pandas 提供了多种创建 DataFrame 对象的方式,主要包含以下五种,分别进行介绍。

1) 创建空的DataFrame对象

import pandas as pd
df = pd.DataFrame()
print(df)

# 输出结果如下:
<span style="color:#444444">Empty DataFrame
Columns: []
Index: []</span>

2) 列表创建DataFame对象

# 示例 1,单一列表创建 DataFrame:
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print(df)

# 输出如下:
<span style="color:#444444">     0
0    1
1    2
2    3
3    4
4    5</span>

# 示例 2,使用嵌套列表创建 DataFrame 对象:
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]

df = pd.DataFrame(data, columns=['Name','Age'])
print(df)
输出结果:
<span style="color:#444444">      Name      Age
0     Alex      10
1     Bob       12
2     Clarke    13</span>

# 指定数值元素的数据类型为 float:
df = pd.DataFrame(data, columns=['Name','Age'], dtype=float)
print(df)
输出结果:
<span style="color:#444444">      Name     Age
0     Alex     10.0
1     Bob      12.0
2     Clarke   13.0</span>

3) 字典嵌套列表创建

data 字典中,键对应的值的元素长度必须相同(也就是列表长度相同)。如果传递了索引,那么索引的长度应该等于数组的长度;如果没有传递索引,那么默认情况下,索引将是 range(n),其中 n 代表数组长度。

​
示例
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print(df)

输出结果:
<span style="color:#444444">      Age      Name
0     28        Tom
1     34       Jack
2     29      Steve
3     42      Ricky</span>


上述示例添加自定义的行标签,index 参数为每行分配了一个索引。
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print(df)

输出结果如下:
<span style="color:#444444">         Age    Name
rank1    28      Tom
rank2    34     Jack
rank3    29    Steve
rank4    42    Ricky</span>

4) 列表嵌套字典创建DataFrame对象

列表嵌套字典可以作为输入数据传递给 DataFrame 构造函数。默认情况下,字典的键被用作列名。

示例
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)

输出结果:
<span style="color:#444444">    
    a    b      c
0   1   2     NaN
1   5   10   20.0</span>

注意:如果其中某个元素值缺失,也就是字典的 key 无法找到对应的 value,将使用 NaN 代替。

# 给上述示例添加行标签索引:
df = pd.DataFrame(data, index=['first', 'second'])
print(df)

输出结果:
<span style="color:#444444">       
        a   b       c
first   1   2     NaN
second  5   10   20.0</span>

5) Series创建DataFrame对象

您也可以传递一个字典形式的 Series,从而创建一个 DataFrame 对象,其输出结果的行索引是所有 index 的合集。 示例如下:

​import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
输出结果如下:

<span style="color:#444444">
      one    two
a     1.0    1
b     2.0    2
c     3.0    3
d     NaN    4</span>

注意:对于 one 列而言,此处虽然显示了行索引 'd',但由于没有与其对应的值,所以它的值为 NaN。

列索引操作DataFrame

DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作。下面依次对这些操作进行介绍。

1) 列索引选取数据列

​import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df ['one'])

输出结果:
<span style="color:#444444">
a     1.0
b     2.0
c     3.0
d     NaN
Name: one, dtype: float64</span>

2) 列索引添加数据列

import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

#使用df['列']=值,插入新的数据列
df['three']=pd.Series([10,20,30],index=['a','b','c'])

#将已经存在的数据列做相加运算
df['four']=df['one']+df['three']

上述示例,我们初次使用了 DataFrame 的算术运算,这和 NumPy 非常相似。除了使用df[]=value的方式外,您还可以使用 insert() 方法插入新的列,示例如下:

​import pandas as pd
info=[['Jack',18],['Helen',19],['John',17]]
df=pd.DataFrame(info, columns=['name','age'])
print(df)

#数值1代表插入到columns列表的索引位置
df.insert(1, column='score',value=[91,90,75])
print(df)

输出结果:
<span style="color:#444444">添加前:
    name  age
0   Jack   18
1  Helen   19
2   John   17

添加后:
    name  score  age
0   Jack     91   18
1  Helen     90   19
2   John     75   17</span>

3) 列索引删除数据列

通过 del 和 pop() 都能够删除 DataFrame 中的数据列。示例如下:

import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
# 原始df
print(df)

#使用del删除
del df['one']
print(df)

#使用pop方法删除
df.pop('two')
print (df)

输出结果:

<span style="color:#444444">原DataFrame:
      one   three  two
a     1.0    10.0   1
b     2.0    20.0   2
c     3.0    30.0   3
d     NaN     NaN   4

使用del删除 first:
      three    two
a     10.0     1
b     20.0     2
c     30.0     3
d     NaN      4

使用 pop()删除:
   three
a  10.0
b  20.0
c  30.0
d  NaN</span>

行索引操作DataFrame

理解了上述的列索引操作后,行索引操作就变的简单。也有选取,添加和删除操作

选取数据行

1) 标签索引选取:loc函数进行标签索引选取

可以将行标签传递给 loc 函数,来选取数据。示例如下:
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df.loc['b'])

输出结果:
one 2.0
two 2.0
Name: b, dtype: float64
注意:loc 允许接两个参数分别是行和列,参数之间需要使用“逗号”隔开,但该函数只能接收标签索引。

2) 整数索引选取:iloc函数进行整数索引选取

  1. import pandas as pd
  2. d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
  4. df = pd.DataFrame(d)
  5. print (df.iloc[2])

输出结果:

<span style="color:#444444">one   3.0
two   3.0
Name: c, dtype: float64</span>

注意:iloc 允许接受两个参数分别是行和列,参数之间使用“逗号”隔开,但该函数只能接收整数索引。

3) 切片操作多行选取

  1. import pandas as pd
  2. d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
  4. df = pd.DataFrame(d)
  5. #左闭右开
  6. print(df[2:4])

输出结果:

<span style="color:#444444">   one  two
c  3.0    3
d  NaN    4</span>

添加数据行

使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行。

  1. import pandas as pd
  2. df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
  3. df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
  4. #在行末追加新数据行
  5. df = df.append(df2)
  6. print(df)

输出结果:

<span style="color:#444444">   a  b
0  1  2
1  3  4
0  5  6
1  7  8</span>

删除数据行

使用drop函数传入索引标签删除数据,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。示例如下:

  1. import pandas as pd
  2. df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
  3. df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
  4. df = df.append(df2)
  5. print(df)
  6. #注意此处调用了drop()方法
  7. df = df.drop(0)
  8. print (df)

输出结果:

<span style="color:#444444">执行drop(0)前:
   a  b
0  1  2
1  3  4
0  5  6
1  7  8

执行drop(0)后:
  a b
1 3 4
1 7 8</span>

在上述的示例中,默认使用 range(2) 生成了行索引,并通过 drop(0) 同时删除了两行数据。

常用属性和方法汇总

DataFrame 的属性和方法,与 Series 相差无几,如下所示:

名称属性&方法描述
T行和列转置。
axes返回一个仅以行轴标签和列轴标签为成员的列表。
dtypes返回每列数据的数据类型。
emptyDataFrame中没有数据或者任意坐标轴的长度为0,则返回True。
ndim轴的数量,也指数组的维数。
shape返回一个元组,表示了 DataFrame 维度。
sizeDataFrame中的元素数量。
values使用 numpy 数组表示 DataFrame 中的元素值。
head()返回前 n 行数据。
tail()返回后 n 行数据。
shift()将行或列移动指定的步幅长度

shift()移动行或列

如果您想要移动 DataFrame 中的某一行/列,可以使用 shift() 函数实现。它提供了一个periods参数,该参数表示在特定的轴上移动指定的步幅。该函数的返回值是移动后的 DataFrame 副本。

shift() 函数的语法格式如下:

DataFrame.shift(periods=1, freq=None, axis=0)  

参数说明如下:

参数名称说明
peroids类型为int,表示移动的幅度,可以是正数,也可以是负数,默认值为1。
freq日期偏移量,默认值为None,适用于时间序。取值为符合时间规则的字符串。
axis如果是 0 或者 "index" 表示上下移动,如果是 1 或者 "columns" 则会左右移动。
fill_value该参数用来填充缺失值。

示例如下:

  1. import pandas as pd
  2. info= pd.DataFrame({'a_data': [40, 28, 39, 32, 18],
  3. 'b_data': [20, 37, 41, 35, 45],
  4. 'c_data': [22, 17, 11, 25, 15]})
  5. #移动幅度为3
  6. info.shift(periods=3)

输出结果:

<span style="color:#444444">
   a_data  b_data  c_data
0     NaN     NaN     NaN
1     NaN     NaN     NaN
2     NaN     NaN     NaN
3    40.0    20.0    22.0
4    28.0    37.0    17.0</span>

下面使用 fill_value 参数填充 DataFrame 中的缺失值,如下所示:

  1. import pandas as pd
  2. info= pd.DataFrame({'a_data': [40, 28, 39, 32, 18],
  3. 'b_data': [20, 37, 41, 35, 45],
  4. 'c_data': [22, 17, 11, 25, 15]})
  5. #移动幅度为3
  6. print(info.shift(periods=3))
  7. #将缺失值和原数值替换为52
  8. info.shift(periods=3,axis=1,fill_value= 52)

输出结果:

<span style="color:#444444">原输出结果:
   a_data  b_data  c_data
0     NaN     NaN     NaN
1     NaN     NaN     NaN
2     NaN     NaN     NaN
3    40.0    20.0    22.0
4    28.0    37.0    17.0

替换后输出:
   a_data  b_data  c_data
0      52      52      52
1      52      52      52
2      52      52      52
3      52      52      52
4      52      52      52</span>

注意:fill_value 参数不仅可以填充缺失值,还也可以对原数据进行替换。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值