DataFrame 是 pandas 库中最核心的数据结构之一,可以看作是一个二维的数据表结构,类似于 Excel 表格或 SQL 中的表格。它由行和列组成,每一列可以存储不同类型的数据(如整数、浮点数、字符串等)。DataFrame 是进行数据分析、处理、清理等操作的强大工具,广泛应用于数据科学和数据分析领域。
以下将从 创建DataFrame、DataFrame的基本操作、DataFrame 的高级操作三方面进行分析和总结,详细介绍每个方法的使用。
import pandas as pd
import numpy as np
# %%%%%%%%%%%%%%%%%创建DataFrame%%%%%%%%%%%%%%%%%%%%%%%%%
# **********从字典创建DataFrame**************
data = {"name": ["li", "wang", "chong"],
"age": [18, 20, 18],
"city": ["河南", "陕西", "杭州"]}
df = pd.DataFrame(data)
print(df)
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# 2 chong 18 杭州
# *********从列表创建DataFrame***************
data = [["li", 18, "河南"],
["wang", 20, "陕西"],
["chong", 18, "杭州"]]
df = pd.DataFrame(data, columns=["name", "age", "city"])
print(df)
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# 2 chong 18 杭州
# *********从Numpy数组创建DataFrame**********
# 不建议使用,可能会碰到需要转换数据类型的错误
# data = np.array([["li", 18, "河南"],
# ["wang", 20, "陕西"],
# ["chong", 18, "杭州"]])
# df = pd.DataFrame(data, columns=["name", "age", "city"])
# print(df)
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# 2 chong 18 杭州
# %%%%%%%%%%%%%%%%%DataFrame的基本操作%%%%%%%%%%%%%%%%%%%
# 1、查看 DataFrame
# ************* 查看前几行数据*******************
print(df.head()) # 默认显示前 5 行
print(df.head(2)) # 显示前 2 行
# ************* 查看后几行数据*******************
print(df.tail()) # 默认显示后 5 行
print(df.tail(2)) # 显示后 2 行
# 显示DataFrame的基本信息,包括每列的类型、非空值数量,dtypes属性,内存占用等
df.info()
# 显示数值型数据的统计摘要(如均值、标准差、最小值、四分位数等)
print(df.describe())
# age
# count 3.000000
# mean 18.666667
# std 1.154701
# min 18.000000
# 25% 18.000000
# 50% 18.000000
# 75% 19.000000
# max 20.000000
# 显示行数和列数
print(df.shape)
# (3, 3)
# 获取列名称
print(df.columns)
# Index(['name', 'age', 'city'], dtype='object')
# 查看每列的数据类型
print(df.dtypes)
# name object
# age int64
# city object
# dtype: object
# 2、访问DataFrame数据
# # *******************访问列*******************
# 访问单列
# print(df["name"])
# # 0 li
# # 1 wang
# # 2 chong
# # Name: name, dtype: object
# 访问多列
# print(df[["name", "age"]])
# # name age
# # 0 li 18
# # 1 wang 20
# # 2 chong 18
# *******************访问行*******************
# # 按位置获取第 0 行数据
print(df.iloc[0])
# name li
# age 18
# city 河南
# Name: 0, dtype: object
# 按标签获取第 0 行数据
print(df.loc[0])
# name li
# age 18
# city 河南
# Name: 0, dtype: object
# 获取第 0 到第 1 行的数据
print(df.iloc[0:2])
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# # **************数据过滤*********************
# # 避免numpy转换的DataFrame int数据类型错误
# 单条件查询,获取 age 大于 18 的行
df_filter = df[df["age"].astype('int64') > 18]
print(df_filter)
# # name age city
# # 1 wang 20 陕西
# 多条件查询,获取 age 大于 18和城市为陕西的行
df_multi_filter = df[(df['age'] > 18) & (df['city'] == '陕西')]
print(df_multi_filter)
# name age city
# 1 wang 20 陕西
# # # ************保存为excel文件****************
# df.to_excel("output.xlsx", index=False)
# 3、修改DataFrame数据
# *****************修改列值**********************
# 增加 age 列的每个值 2
df['age'] = df['age'] + 2
print(df)
# # *****************新增列*********************
df["salary"] = [20000, 30000, 50000] # 新增1列
print(df)
# name age city Salary
# 0 li 18 河南 20000
# 1 wang 20 陕西 30000
# 2 chong 18 杭州 50000
# *****************删除列*********************
df.drop('salary', axis='columns', inplace=True) # 删除salary 列,inplace=True 表示原地修改
print(df)
# name age city
# 0 li 20 河南
# 1 wang 22 陕西
# 2 chong 20 杭州
# *****************重命名列*********************
# df.rename(columns={'age': 'age_years'}, inplace=True) # 将 Age 列重命名为 Age_Years
# print(df)
# name age_years city
# 0 li 20 河南
# 1 wang 22 陕西
# 2 chong 20 杭州
# 4、数据清理
# *****************处理缺失值*********************
# 删除包含 NaN 的行
df.dropna()
# 将所有 NaN 替换为 0
df.fillna(0)
# 使用列的均值填充 NaN
# df['age'].fillna(df['age'].mean(), inplace=True)
df
# ******************删除重复值*********************
data = [["li", 18, "河南"],
["wang", 20, "陕西"],
["chong", 18, "杭州"],
["li", 18, "河南"]]
df = pd.DataFrame(data, columns=["name", "age", "city"])
print(df)
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# 2 chong 18 杭州
# 3 li 18 河南
df.drop_duplicates(inplace=True) # 删除重复的行
print(df)
# name age city
# 0 li 18 河南
# 1 wang 20 陕西
# 2 chong 18 杭州
# 5、数据排序
# ******************按列排序*********************
# 按 age列升序排序
df.sort_values(by='age', ascending=True, inplace=True)
print(df)
# name age city
# 0 li 18 河南
# 2 chong 18 杭州
# 1 wang 20 陕西
# 按 age 列降序排序
df.sort_values(by='age', ascending=False, inplace=True)
print(df)
# name age city
# 1 wang 20 陕西
# 0 li 18 河南
# 2 chong 18 杭州
# 按多个列排序
df.sort_values(by=['age', 'name'], ascending=[True, False], inplace=True)
print(df)
# name age city
# 0 li 18 河南
# 2 chong 18 杭州
# 1 wang 20 陕西
# 按索引降序排列
data = [["li", 18, "河南"],
["wang", 20, "陕西"],
["chong", 18, "杭州"],
["li", 18, "河南"]]
df = pd.DataFrame(data, columns=["name", "age", "city"])
print(df)
df.sort_index(ascending=False, inplace=True)
print(df)
# name age city
# 3 li 18 河南
# 2 chong 18 杭州
# 1 wang 20 陕西
# 0 li 18 河南
# 6. 分组和聚合
# 按某列分组并进行聚合操作(如均值、求和等)
data = [["li", 18, "河南"],
["wang", 20, "陕西"],
["chong", 18, "杭州"],
["zhu", 22, "河南"]]
df = pd.DataFrame(data, columns=["name", "age", "city"])
print(df)
print(df.groupby("city")["age"].sum())
# city
# 杭州 18
# 河南 40
# 陕西 20
# Name: age, dtype: int64
print(df.groupby(["city", "name"])["age"].mean())
# city name
# 杭州 chong 18.0
# 河南 li 18.0
# zhu 22.0
# 陕西 wang 20.0
# Name: age, dtype: float64
# 聚合多个列
df["salary"] = [20000, 30000, 40000, 50000] # 新增1列
print(df)
# name age city salary
# 0 li 18 河南 20000
# 1 wang 20 陕西 30000
# 2 chong 18 杭州 40000
# 3 zhu 22 河南 50000
# 对 age 计算均值,对 salary 计算和
print(df.groupby('city').agg({'age': 'mean', 'salary': 'sum'}))
# age salary
# city
# 杭州 18.0 40000
# 河南 20.0 70000
# 陕西 20.0 30000
# 7、合并、连接和操作数据
# 合并两个 DataFrame
data1 = {"name": ["li", "wang", "chong"],
"age": [18, 20, 18]}
df_1 = pd.DataFrame(data1)
data2 = {"name": ["li", "wang", "chong","zhu"],
"salary": [200000, 300000, 100000, 80000]}
df_2 = pd.DataFrame(data2)
df12 = df_1.merge(df_2, on="name")
print(df12)
# name age salary
# 0 li 18 200000
# 1 wang 20 300000
# 2 chong 18 100000
df_1_2 = pd.merge(df_1, df_2, on="name")
print(df_1_2)
# name age salary
# 0 li 18 200000
# 1 wang 20 300000
# 2 chong 18 100000
# 拼接两个 DataFrame
df1 = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})
df2 = pd.DataFrame({'Name': ['Charlie', 'David'], 'Age': [35, 40]})
# 纵向拼接
concat_df = pd.concat([df1, df2], ignore_index=True)
# 注意 ignore_index 如果为False,则索引为 0 1 0 1
print(concat_df)
# Name Age
# 0 Alice 25
# 1 Bob 30
# 2 Charlie 35
# 3 David 40
# 8. 导入和导出数据
# *************读取 CSV 文件****************
# df = pd.read_csv('data.csv')
# *************读取 Excel 文件****************
# df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 保存为 CSV 文件,index=False 不保存索引
# df.to_csv('output.csv', index=False)
# 保存为 Excel 文件,index=False 不保存索引
# df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
# %%%%%%%%%%%%%%%%%%%DataFrame 的高级操作%%%%%%%%%%%%%%%%%%%%
data = {"name": ["li", "wang", "chong"],
"age": [18, 20, 18],
"city": ["河南", "陕西", "杭州"]}
df = pd.DataFrame(data)
# 1. 使用 apply 函数
# apply 函数可以对 DataFrame 的每一列或每一行应用自定义函数,非常灵活。
df['future_age'] = df['age'].apply(lambda x: x + 10) # 对 Age 列应用 lambda 函数
print(df)
# name age city future_age
# 0 li 18 河南 28
# 1 wang 20 陕西 30
# 2 chong 18 杭州 28
# 2. 透视表(Pivot Table)
# pivot_table 用于创建类似 Excel 的透视表,帮助对数据进行多维汇总和分析
data = {
'Name': ['Alice', 'Bob', 'Alice', 'Bob', 'Charlie'],
'City': ['New York', 'Los Angeles', 'New York', 'Los Angeles', 'New York'],
'Age': [25, 30, 27, 28, 35]
}
df = pd.DataFrame(data)
print(df)
# Name City Age
# 0 Alice New York 25
# 1 Bob Los Angeles 30
# 2 Alice New York 27
# 3 Bob Los Angeles 28
# 4 Charlie New York 35
pivot = df.pivot_table(values='Age', index='City', columns='Name', aggfunc='mean')
print(pivot)
# Name Alice Bob Charlie
# City
# Los Angeles NaN 29 NaN
# New York 26.0 NaN 35.0
# 3、时间序列数据处理
# 创建示例数据
data = {
'Date': ['2023-01-05', '2023-01-15', '2023-02-03', '2023-02-20', '2023-03-05', '2023-03-25'],
'Temperature': [5, 7, 10, 8, 15, 12],
'Rainfall': [10, 12, 8, 5, 0, 2]
}
# 创建 DataFrame
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 原始数据:
# Date Temperature Rainfall
# 0 2023-01-05 5 10
# 1 2023-01-15 7 12
# 2 2023-02-03 10 8
# 3 2023-02-20 8 5
# 4 2023-03-05 15 0
# 5 2023-03-25 12 2
# 将 Date 列转换为 datetime 格式
df['Date'] = pd.to_datetime(df['Date'])
# 将 Date 列设置为索引
df.set_index('Date', inplace=True)
print("设置日期为索引后的数据:")
print(df)
# 设置日期为索引后的数据:
# Temperature Rainfall
# Date
# 2023-01-05 5 10
# 2023-01-15 7 12
# 2023-02-03 10 8
# 2023-02-20 8 5
# 2023-03-05 15 0
# 2023-03-25 12 2
# 按月重采样并计算每月的平均值
monthly_average = df.resample('M').mean()
print("按月重采样后的数据:")
print(monthly_average)
# 按月重采样后的数据:
# Temperature Rainfall
# Date
# 2023-01-31 6.0 11.0
# 2023-02-28 9.0 6.5
# 2023-03-31 13.5 1.0
【以上基本上涵盖了pandas库中DataFrame的所有常用的用法,欢迎各位学习和交流!】