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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现