Pandas 数据结构 - Series
Pandas 中的 Series
是一种类似于一维数组的数据结构,可以保存任意数据类型的元素,并且每个元素都与一个索引相关联。
-
1. 索引
每个
Series
对象都有一个索引,它允许我们对数据进行标记和访问。主要特点包括:-
自动创建索引: 如果我们没有显式地提供索引,Pandas 会自动创建一个默认的整数索引(类似于数组的索引)。
-
多种类型的索引: 索引可以是整数、字符串、日期等各种数据类型,这使得
Series
可以适应不同类型的数据和应用场景。 -
标签化数据访问: 索引允许我们使用标签来访问数据,而不仅仅是基于位置的整数索引。这种方式使得
Series
更加灵活和易于理解。
2. 数据类型
Series
可以容纳多种数据类型的元素,这些数据类型可以是:-
整数 (
int
) -
浮点数 (
float
) -
字符串 (
str
) -
日期时间 (
datetime
) -
布尔值 (
bool
) -
Python 对象 (
object
):可以是任何 Python 对象,甚至是自定义的复杂对象。
-
pandas.Series( data, index, dtype, name, copy)
参数说明:
-
data:一组数据(ndarray 类型)。
-
index:数据索引标签,如果不指定,默认从 0 开始。
-
dtype:数据类型,默认会自己判断。
-
name:设置名称。
-
copy:拷贝数据,默认为 False。
#指定索引,索引值就从 0 开始 import pandas as pd a=[1,2,3] p=pd.Series(a) print(p,p[1]) #指定索引值,根据索引值读取数据 a = ["python", "numpy", "pandas"] p = pd.Series(a,index= ["x", "y", "z"]) print(p,p["y"]) #也可以使用 key/value 对象,类似字典来创建 Series,字典的 key 变成了索引值 dict1= {1: "python", 2: "numpy", 3: "pandas"} p= pd.Series(dict1) print(p) #字典中的一部分数据,只需要指定需要数据的索引即可 dict2= {1: "python", 2: "numpy", 3: "pandas"} p1 = pd.Series(dict2, index = [1, 2]) print(p1) #设置 Series 名称参数 dict= {1: "python", 2: "numpy", 3: "pandas"} p = pd.Series(dict, index = [1, 2],name="ai") print(p)
Pandas 数据结构 - DataFrame
DDataFrame 是 Pandas 中用来处理和分析数据的重要工具,它提供了高效的数据操作和处理能力,可以轻松地进行数据清洗、转换、选择、切片和聚合等操作。对于数据分析和机器学习任务,DataFrame 是不可或缺的数据结构之一。
DataFrame 特点:
-
二维数据结构:
-
DataFrame 是一个二维表格,由多行和多列组成。每列可以包含不同类型的数据(数值、字符串、布尔值等),每行则表示数据的一个观察结果或样本。
-
-
类似字典结构:
-
DataFrame 可以被视为由多个列组成的字典。每一列可以是不同的数据类型,但它们共享一个行索引。
-
-
行和列索引:
-
DataFrame 有行索引(index)和列索引(columns)。行索引用于标识每行的唯一性,列索引则用于标识每列的名称和顺序。
-
DataFrame 构造方法如下:
pandas.DataFrame( data, index, columns, dtype, copy)
参数说明:
-
data:一组数据(ndarray、series, map, lists, dict 等类型)。
-
index:索引值,或者可以称为行标签。
-
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
-
dtype:数据类型。
-
copy:拷贝数据,默认为 False。
Pandas DataFrame 是一个二维的数组结构。
#从字典创建 import pandas as pd data = { 'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['New York', 'Los Angeles', 'Chicago'] } df = pd.DataFrame(data) #从列表或数组创建 data = [ ['Alice', 25, 'New York'], ['Bob', 30, 'Los Angeles'], ['Charlie', 35, 'Chicago'] ] columns = ['Name', 'Age', 'City'] df = pd.DataFrame(data, columns=columns)
data 是一个二维列表,每个子列表表示一行数据,columns 指定了列名。
使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:
注意:返回结果其实就是一个 Pandas Series 数据。
import pandas as pd data = { 'A': [10, 20, 30], 'B': [40, 50, 60] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) print(df.loc[0]) print(df.loc[1]) #返回多行数据 print(df.loc[[0, 1]]) #指定行索引值 df = pd.DataFrame(data, index = ["day1", "day2", "day3"]) print(df) print(df.loc["day2"])
Pandas CSV 文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
pd.read_csv(path) 读取csv文件数据
import pandas as pd # 读取 CSV 文件 url = 'https://static.jyshare.com/download/nba.csv' df = pd.read_csv(url) # 显示前几行数据 print(df.head())
pd.to_csv() 将DataFrame 存储为 csv 文件:
import pandas as pd data = { 'Name': ['LeBron James', 'Stephen Curry', 'Kevin Durant'], 'Team': ['Lakers', 'Warriors', 'Nets'], 'Points': [27.0, 24.2, 26.0] } df = pd.DataFrame(data) # 将 DataFrame 保存为 CSV 文件 df.to_csv('nba_players.csv', index=False)
数据处理
1、head()
head( n ) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5 行。
读取前面 5 行
#读取前面 5 行 import pandas as pd df = pd.read_csv('nba.csv') print(df.head()) #读取前面 10 行 print(df.head(10))
2、tail()
tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN。
#读取末尾 5 行 import pandas as pd df = pd.read_csv('nba.csv') print(df.tail()) # 读取末尾 10 行 print(df.tail(10))
3、info()
info() 方法返回表格的一些基本信息:
import pandas as pd df = pd.read_csv('nba.csv') print(df.info())
输出结果为:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 458 entries, 0 to 457 # 行数,458 行,第一行编号为 0 Data columns (total 9 columns): # 列数,9列 # Column Non-Null Count Dtype # 各列的数据类型 --- ------ -------------- ----- 0 Name 457 non-null object 1 Team 457 non-null object 2 Number 457 non-null float64 3 Position 457 non-null object 4 Age 457 non-null float64 5 Height 457 non-null object 6 Weight 457 non-null float64 7 College 373 non-null object # non-null,意思为非空的数据 8 Salary 446 non-null float64 dtypes: float64(4), object(5) # 类型
non-null 为非空数据,我们可以看到上面的信息中,总共 458 行,College 字段的空值最多。
Pandas JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于人类阅读和编写的文本格式存储和交换数据,并且易于机器解析和生成。JSON 的主要优势在于其简洁性和灵活性,通常用于传输数据、配置文件以及存储结构化数据。
JSON 的基本结构
JSON 数据结构包括以下几个基本元素:
-
对象(Object):由一组键值对组成。键(键名)是字符串,值可以是字符串、数字、布尔值、数组、对象或
null
。对象用花括号{}
括起来。jsonCopy Code{ "name": "John", "age": 30, "isStudent": false }
-
数组(Array):由一组值组成,值可以是字符串、数字、布尔值、对象、数组或
null
。数组用方括号[]
括起来。jsonCopy Code[ "apple", "banana", "cherry" ]
-
值(Value):可以是字符串(用双引号括起来)、数字(整数或浮点数)、布尔值(
true
或false
)、对象、数组或null
。
使用 JSON 在 Python 中
Python 中可以使用 json
模块来处理 JSON 数据。以下是如何在 Python 中读取和写入 JSON 数据的示例:
读取 JSON 文件
假设你有一个 JSON 文件 data.json
,内容如下:
jsonCopy Code{ "name": "John", "age": 30, "isStudent": false, "courses": ["Math", "Science"], "address": { "city": "New York", "state": "NY" } }
你可以使用以下代码读取 JSON 文件:
pythonCopy Codeimport json # 读取 JSON 文件 with open('data.json', 'r') as file: data = json.load(file) # 显示读取的数据 print(data)
写入 JSON 文件
你可以将一个 Python 对象(如字典)写入 JSON 文件:
pythonCopy Codeimport json # 创建一个示例数据字典 data = { "name": "Alice", "age": 25, "isStudent": True, "courses": ["Biology", "Chemistry"], "address": { "city": "Los Angeles", "state": "CA" } } # 读取 JSON 转为 DataFrame df = pd.DataFrame(data) print(df)
Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。
使用到的测试数据 property-data.csv 如下:
上表包含了四种空数据:
-
n/a
-
NA
-
—
-
na
1、Pandas 清洗空值
import pandas as pd import numpy as np # 创建一个示例 DataFrame data = { 'A': [1, np.nan, 3], 'B': [4, 5, np.nan], 'C': [7, 8, 9] } df = pd.DataFrame(data) # 判断各个单元格是否为空 null_mask = df.isnull() print(null_mask) #1. 删除空值 #删除包含空值的行 df_cleaned_rows = df.dropna() # 删除包含空值的行 #删除包含空值的列 df_cleaned_cols = df.dropna(axis=1) # 删除包含空值的列 #2.填充空值 #使用常量填充 df_filled = df.fillna(value=0) # 用 0 填充空值 #使用均值填充 df_filled_ffill = df.fillna(method='ffill') # 向前填充 #向前填充(用前一个值填充) df_filled_ffill = df.fillna(method='ffill') # 向前填充 #向后填充(用下一个值填充) df_filled_bfill = df.fillna(method='bfill') # 向后填充 #3。统计空值数量 #统计每列的空值数量 null_counts = df.isnull().sum() print(null_counts) #统计每行的空值数量 null_counts_rows = df.isnull().sum(axis=1) print(null_counts_rows)
2、Pandas 清洗格式错误日期
pd.to_datetime()格式化日期:
import pandas as pd df = pd.DataFrame({ 'date': ['2024-08-09', '08/09/2024', '2024.08.09'] }) df['parsed_date'] = pd.to_datetime(df['date']) print(df)
3、Pandas 清洗错误数据
#替换错误年龄的数据 import pandas as pd import numpy as np # 示例 DataFrame data = { 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'age': [25, -5, 150, 30, 200] } df = pd.DataFrame(data) # 定义合理的年龄范围 min_age = 0 max_age = 120 # 替换错误的年龄数据为 NaN df['age'] = df['age'].apply(lambda x: x if min_age <= x <= max_age else np.nan) # 用均值填充 NaN df['age'].fillna(df['age'].mean(), inplace=True) print(df)
4、Pandas 清洗重复数据
如果我们要清洗重复数据,可以使用 duplicated() 和 drop_duplicates() 方法。
如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。
import pandas as pd person = { "name": ['python', 'numpy' , 'numpy' , 'pandas'], "age": [50, 40, 40, 23] } df = pd.DataFrame(person) print(df.duplicated())
删除重复数据,可以直接使用drop_duplicates() 方法。
import pandas as pd persons = { "name": ['Google', 'Runoob', 'Runoob', 'Taobao'], "age": [50, 40, 40, 23] } df = pd.DataFrame(persons) df.drop_duplicates(inplace = True) print(df)