Pandas学习——series和DataFrame的基本生成

数据结构介绍

名称 说明
Series 一维带标签的同种数据类型的数组
DataFrame 二维带标签的大小可变的各列数据类型可以不同的二维表格
Panel 三维带标签大小可变的数组

可以把DataFrame看作Series的容器,把Panel看作是DataFrame的容器

序列

Series的生成方式是多种多样的,可以用numpy去生成一个序列

>>> s = pd.Series(np.random.rand(5))

0    0.350976
1    0.735377
2    0.330421
3    0.466046
4    0.749564
dtype: float64

打印出来的序列,左边是标签,右边是值。默认情况下索引从0开始。可以用Index和values属性得到索引和数据。

>>> s.index
RangeIndex(start=0, stop=5, step=1)

>>> s.values
array([0.35097618, 0.73537748, 0.33042106, 0.46604558, 0.74956398])

可以在创建序列的时候同时声明索引(支持重复索引)

>>> s = pd.Series(np.random.rand(5), index=['a','b','c','d','a'])
a    0.694635
b    0.068107
c    0.302411
d    0.044751
a    0.858449
dtype: float64

也可以使用字典生成,没有指定索引值的情况下,默认采用关键字作为索引值

>>> b = {
    
    'a':1, 'b':5, 'c':8}
>>> pd.Series(b)
a    1
b    5
c    8
dtype: int64

也可以定义索引值

>>> pd.Series(b, index={
    
    'a', 'b', 'c', 'd'})
c    8.0
b    5.0
d    NaN
a    1.0
dtype: float64

(为啥会乱序……)最好index和数据,长度一样,可以看到不一样使用nan填充,但是会出现一些问题。

如果是纯量,设置好索引会自动填充到索引大小一致

>>> pd.Series(1, index=['a','b','c','d','r'])
a    1
b    1
c    1
d    1
r    1
dtype: int64

可以使用索引值来检索数据

>>> s['a']
a    0.694635
a    0.858449
dtype: float64
    
>>> s[['a','d']]
a    0.694635
a    0.858449
d    0.044751
dtype: float64

序列和数组很相似,也可以用切片和布尔值运算进行操作

>>> s[s>0.5]
a    0.694635
a    0.858449
dtype: float64
    
>>> s[1:3]
b    0.068107
c    0.302411
dtype: float64

序列和数组的一个不同是:不通过序列间进行运算,相同索引会自动对齐并进行运算,拥有name属性,可以给序列标名字

>>> test=pd.Series(np.arange(5), index=['a','b','c','d','e'], name='hh')
>>> test
a    0
b    1
c    2
d    3
e    4
Name: hh, dtype: int32
        
>>> test[1:]+test[:-1]
a    NaN
b    2.0
c    4.0
d    6.0
e    NaN
Name: hh, dtype: float64
        
>>> test.name
'hh'

数据框

DataFrame是二维带标签的各列数据类型可以不同的数据结构。生成数据框的时候,可以定义行标签、列标签,注意匹配关系。

比较常用的是使用python的字典结构来生成数据框

>>> data = {
    
    '城市':['北京','上海','深圳','成都','杭州'], '人口/千万':[2171,2415,1191,1591.8,901.3]}

>>> frame = DataFrame(data)
城市	人口/千万
0	北京	2171.0
1	上海	2415.0
2	深圳	1191.0
3	成都	1591.8
4	杭州	901.3

这里没有定义行标签,pandas会自动生成行标签,排序后的字典的键会成为列标签。

也可以通过columns设置各参数的先后顺序

>>> pd.DataFrame(data, columns=['人口/千万', '城市'])
	人口/千万	城市
0	2171.0	北京
1	2415.0	上海
2	1191.0	深圳
3	1591.8	成都
4	901.3	杭州

同理,可以使用index设置行标签

定义列标签时,如果数据不存在,会显示NaN

也可以字典内嵌套序列来生成。不在赘述。

有两种取列的方式:

>>> frame.城市
0    北京
1    上海
2    深圳
3    成都
4    杭州
Name: 城市, dtype: object
        
>>> data['人口/千万']
0    2171.0
1    2415.0
2    1191.0
3    1591.8
4     901.3
Name: 人口/千万, dtype: float64
  • loc函数

    loc函数里的参数是数据框的行标签,返回一个序列。对行进行分片的时候返回一个数据框,也可以使用bool进行索引。对数据框的操作语法和字典是类似的

    >>> frame.loc[0]
    城市         北京
    人口/千万    2171
    Name: 0, dtype: object
            
    >>> frame.pop('城市')
    0    北京
    1    上海
    2    深圳
    3    成都
    4    杭州
    Name: 城市, dtype: object
    

    此时数据被删除

    >>> frame
    人口/千万
    0	2171.0
    1	2415.0
    2	1191.0
    3	1591.8
    4	901.3
    

    也可以使用del去删除某列,语法是: del frame['城市']

    默认情况下,Insert会插入数据框的末尾,也可以设定插入位置

    >>> frame.insert(0,'年份',pd.Series([2015,2015,2016,2007,2009]))
    年份	人口/千万
    0	2015	2171.0
    1	2015	2415.0
    2	2016	1191.0
    3	2007	1591.8
    4	2009	901.3
    

    弹出、删除、插入操作都是对原数据进行修改。选择行列的时候都是对原数据的指代,不会复制原数据

也可以使用嵌套的字典来生成df

>>> data = {
    
    '北京':{
    
    '年份':2015,'人口':'2171'}}

>>> pd.DataFrame(data)
	北京
人口	2171
年份	2015

T可以转置数据框

>>> pd.DataFrame(data).T
	人口	年份
北京	2171	2015

猜你喜欢

转载自blog.csdn.net/m0_50470999/article/details/108560549