Pandas - 1

1. Pandas

pandas是一个专门用于数据分析的开源Python库。

2. 安装

pip install pandas

3. pandas的数据结构

  • Series 存放一维数据,由索引和数据组成
  • DataFrame 存放多维数据, 是一个表格型的数据结构。有行索引,也有列索引。

3.1 Series

和数组类似,由数据和数据所关联的标签(索引)组成。

>>> import pandas as pd
>>> pd.Series(['a','b','c','d'])
0    a
1    b
2    c
3    d
dtype: object

其中:0,1,2,3是标签(索引),它存放在index数组中,后面的是数据(一维数组),类型为object

3.1.1 创建Series对象
 Series(data=None, index=None, dtype: 'Dtype | None' = None, name=None, copy: 'bool | None' = None, fastpath: 'bool' = False) -> 'None'
  • data 一组数据
  • index 数据索引标签,如果不指定默认从0开始
  • dtype 数据类型,默认自己判断
  • name 设置名称
  • copy 拷贝数据,默认为False

例:通过列表创建Series对象

>>> a = [1,2,3]
>>> s = pd.Series(a)
>>> s
0    1
1    2
2    3
dtype: int64

数据类型是:int64

例:自定义标签(索引)

>>> a = [(0,0),(5,5),(8,8)]
>>> s = pd.Series(data = a, index=["x","y","z"])
>>> print(s)
x    (0, 0)
y    (5, 5)
z    (8, 8)
dtype: object

索引用x,y,z 表示。

例:通过字典创建,键就是索引

>>> a = {1:'a', 2:'b', 3:'hello'}
>>> s = pd.Series(a)
>>> print(s)
1        a
2        b
3    hello
dtype: object
>>>

我们发现:Series对象中有两个数组,一个存放索引,一个存放数据。

可以通过下面的方法查看两个数组:

>>> a = pd.Series([1,2,3,4])
>>> a.index
RangeIndex(start=0, stop=4, step=1)
>>> a.values
array([1, 2, 3, 4], dtype=int64)
>>>
3.1.2 选择内部元素

用标签获取

>>> a = pd.Series([1,2,3,4])
>>> a[0]
1
>>> type(a[0])
<class 'numpy.int64'>
>>> a = pd.Series([1,2,3],index=["a","b","c"])
>>> a["b"]
2

切片

>>> a = pd.Series([1,2,3],index=["a","b","c"])
>>> a[1:3]
b    2
c    3
dtype: int64

返回的是一个Series对象

3.1.3 为内部元素赋值
>>> a = pd.Series([1,2,3,4])
>>> a[0] = "hello"
>>> print(a)
0    hello
1        2
2        3
3        4
dtype: object
3.1.4 筛选元素
>>> a = pd.Series([1,2,3,4])
>>> a[a>2]
2    3
3    4
dtype: int64
3.1.5 数学运算

可以进行+,-,*,/等运算

>>> a = pd.Series([1,2,3,4])
>>> c = a * 2
>>> c
0    2
1    4
2    6
3    8
dtype: int64

两个Series对象也可以运算:

>>> s1 = pd.Series([1,2,3,4])
>>> s2 = s1.copy()
>>> s1+s2
0    2
1    4
2    6
3    8
dtype: int64
>>> s3 = pd.Series([1,2,3,4,5,6])
>>> s1 + s3
0    2.0
1    4.0
2    6.0
3    8.0
4    NaN
5    NaN
dtype: float64

对于索引不同的,则结果是NaN

3.1.6 重复的元素

series.unique() 去掉重复的,返回一个数组。

>>> s = pd.Series([1,1,1,2,3,3,3,4,5])
>>> s
0    1
1    1
2    1
3    2
4    3
5    3
6    3
7    4
8    5
dtype: int64
>>> s.unique()
array([1, 2, 3, 4, 5], dtype=int64)
>>> c = s.unique()
>>> type(c)
<class 'numpy.ndarray'>
>>> print(c)
[1 2 3 4 5]

series.value_counts()

返回不重复的元素,还统计重复的次数。

>>> s = pd.Series([1,1,1,2,3,3,3,4,5])
>>> c = s.value_counts()
>>> type(c)
<class 'pandas.core.series.Series'>
>>> c
1    3
3    3
2    1
4    1
5    1
Name: count, dtype: int64
3.1.7 判断数据在不在Series中

用isin函数来判断,返回True,False

>>> s = pd.Series([1,1,1,2,3,3,3,4,5])
>>> s
0    1
1    1
2    1
3    2
4    3
5    3
6    3
7    4
8    5
dtype: int64
>>> s.isin([1,3])
0     True
1     True
2     True
3    False
4     True
5     True
6     True
7    False
8    False
dtype: bool
3.1.8 NaN

not a number ,非数值。数据结构中若字段为空或者不符合数字的定义时,用这个特定的值来表示。

可以用isnull或notnull还识别是否为NaN

>>> import numpy as np
>>> import pandas as pd
>>> s = pd.Series([1,-1,5,np.NaN,7])
>>> s
0    1.0
1   -1.0
2    5.0
3    NaN
4    7.0
dtype: float64
>>> s.isnull()
0    False
1    False
2    False
3     True
4    False
dtype: bool
>>> s.notnull()
0     True
1     True
2     True
3    False
4     True
dtype: bool

3.2 DataFrame

在Series里的Index数组存放每个元素的标签,在DataFrame中有两个数组,一个存放的是每一行的标签,一个是存放列标签。

import pandas as pd

data = {
    'color': ['blue', 'green'],
    'object': ['ball', 'pen'],
    'price': [68.5, 2.5]
}

frame = pd.DataFrame(data)
print(frame)
print(frame.index)  # 行
print(frame.columns) # 列

   color object  price
0   blue   ball   68.5
1  green    pen    2.5

RangeIndex(start=0, stop=2, step=1)
Index(['color', 'object', 'price'], dtype='object')
3.2.1 创建DataFrame
DataFrame(data=None, index: 'Axes | None' = None, columns: 'Axes | None' = None, dtype: 'Dtype | None' = None, copy: 'bool | None' = None) -> 'None'
  • data 一组数据
  • index 行索引(标签)
  • columns 列索引(标签)
  • dtype (类型)
  • copy 复制数据,默认为False

用列表创建

>>> data = [['google','www.google.com'],['baidu','www.baidu.com']]
>>> df = pd.DataFrame(data)
>>> df
        0               1
0  google  www.google.com
1   baidu   www.baidu.com

可以指定行索引和列索引:

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=[1,2])
>>> df
   姓名  年龄   语文   数学
1  张三   5  100  100
2  李四   6  100  100

用字典创建

data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data, index=range(1,3))
print(frame)

   姓名  年龄    语文   数学
1  张三  15  98.5  100
2  李四  16  99.0  100

键就是列标签,也可以指定需要的数据:

data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data,columns=['姓名','数学'])
print(frame)

   姓名   数学
0  张三  100
1  李四  100

3.2.2 选取数据

获取所有列标签

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=[1,2])
>>> df.columns
Index(['姓名', '年龄', '语文', '数学'], dtype='object')

columns是存放所有列

获取所有行标签

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=["one","two"])
>>> df.index
Index(['one', 'two'], dtype='object')

index存放所有行

获取所有值

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=["one","two"])
>>> df.values
array([['张三', 5, 100, 100],
       ['李四', 6, 100, 100]], dtype=object)

values表示所有值

获取某一列

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=["one","two"])
>>> df["姓名"]
one    张三
two    李四
Name: 姓名, dtype: object
        
>>> df.姓名
one    张三
two    李四
Name: 姓名, dtype: object

可以用df["列标签"] 或df.列标签获取列数据

如果要获取多列:

>>> df[["姓名","语文"]]
     姓名   语文
one  张三  100
two  李四  100

获取某一行

>>> df = pd.DataFrame([['张三',5,100,100],['李四',6,100,100]],columns=['姓名','年龄','语文','数学'],index=["one","two"])
>>> df.loc["two"]
姓名     李四
年龄      6
语文    100
数学    100
Name: two, dtype: object
>>>

df.loc[行标签]

获取多行:

>>> df.loc[["two","one"]]
     姓名  年龄   语文   数学
two  李四   6  100  100
one  张三   5  100  100

获取切片范围的行

>>> df = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]])
>>> df
   0  1
0  1  2
1  3  4
2  5  6
3  7  8
>>> df[1:3]
   0  1
1  3  4
2  5  6

获取某一个单元格

>>> df = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]])
>>> df
   0  1
0  1  2
1  3  4
2  5  6
3  7  8
>>> df[1][0]
2

df[列标签][行标签]

也可以用df.loc[行标签][列标签] 来获取。

df.loc的用法

用法 说明
df.loc[行标签, 列标签] 获取某一行中的某一列
df.loc[[行标签, 行标签, ...]] 获取多行
df.loc[行标签1:行标签n] 切片获取从行标签1到行标签n(包括n)
df.loc['a':'f', [列标签1,列标签2,...]] 获取切片行之后,取指定的列
df.loc[:, [列标签1,列标签2, ...]] 获取所有行指定的列
3.2.2 赋值

增加一个新列

data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data)

frame["英语"] = [90,100]
print(frame)
# 如果要删除一列
# del frame[列标签]

frame["新列表"] = 值,如果这个列名已经存在则是修改数据。

增加一行

data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data)
frame.loc[2] = ['王五', 14, 100, 100]
print(frame)

frame.loc[行标签] = 值

修改某个单元格的数据

data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data)
frame['姓名'][0] = "小红"
print(frame)

先列,后行,但有一个警告

3.2.3 转置
data = {
    '姓名': ['张三', '李四'],
    '年龄': [15, 16],
    '语文': [98.5, 99],
    '数学': [100, 100]
}

frame = pd.DataFrame(data)
print(frame)
   姓名  年龄    语文   数学
0  张三  15  98.5  100
1  李四  16  99.0  100

print(frame.T)
       0     1
姓名    张三    李四
年龄    15    16
语文  98.5  99.0
数学   100   100
posted @   叁只小羊  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示