引言
接上一篇《关于Python中的series详解与应用》。本篇将详细介绍DataFrame,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较。
什么是DataFrame
DataFrame是Pandas库中的一种二维标签数据结构,可以看作是一种带有行和列标签的表格数据。它既有行索引,也有列索引,每列可以是不同的数据类型。DataFrame类似于电子表格或SQL表格,非常适合用于数据分析和处理。
创建DataFrame
可以通过多种方式创建DataFrame,常见的方法包括使用字典、列表、Numpy数组或读取文件。
import pandas as pd
import numpy as np
# 使用字典创建DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Salary': [50000, 60000, 70000]
}
df1 = pd.DataFrame(data)
print(df1)
print("*" * 20, "分隔符", "*" * 20)
# 使用列表创建DataFrame
data = [
['Alice', 25, 50000],
['Bob', 30, 60000],
['Charlie', 35, 70000]
]
df2 = pd.DataFrame(data, columns=['Name', 'Age', 'Salary'])
print(df2)
print("*" * 20, "分隔符", "*" * 20)
# 使用Numpy数组创建DataFrame
data = np.array([
['Alice', 25, 50000],
['Bob', 30, 60000],
['Charlie', 35, 70000]
])
df3 = pd.DataFrame(data, columns=['Name', 'Age', 'Salary'])
print(df3)
print("*" * 20, "分隔符", "*" * 20)
# 读取CSV文件创建DataFrame
# df4 = pd.read_csv('data.csv')#读者自行选择文件读取
# print(df4)
上述代码运行结果如下:
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
DataFrame的常用操作
访问和修改数据
可以通过行标签和列标签访问和修改DataFrame中的数据。
# 访问数据
print(df1['Name']) # 访问单列
print(df1[['Name', 'Age']]) # 访问多列
print(df1.loc[0]) # loc 使用行和列的标签来进行访问。例如,df1.loc[0] 表示访问标签为 0 的那一行
print("*" * 20, "分隔符", "*" * 20)
print(df1.iloc[0]) # iloc 使用行和列的整数位置来进行访问。例如,df1.iloc[0] 表示访问第0行(第一行)
print("*" * 20, "分隔符", "*" * 20)
# 修改数据
df1.at[0, 'Age'] = 26 # 将索引为0的那一行年龄更改为26
df1.loc[1, 'Salary'] = 65000 # 将索引为1的那一行工资更改为65000
print(df1)
上述代码运行结果为:
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
Name Alice
Age 25
Salary 50000
Name: 0, dtype: object
Name Alice
Age 25
Salary 50000
Name: 0, dtype: object
******************** 分隔符 ********************
Name Age Salary
0 Alice 26 50000
1 Bob 30 65000
2 Charlie 35 70000
添加和删除数据
可以轻松地添加和删除行或列。
# 添加列
df1['Bonus'] = [5000, 6000, 7000]
print(df1)
print("*" * 20, "分隔符", "*" * 20)
# 删除列
df1.drop('Bonus', axis=1, inplace=True)
print(df1)
print("*" * 20, "分隔符", "*" * 20)
# 添加行
new_row = pd.Series(['David', 40, 80000], index=['Name', 'Age', 'Salary'])
df1 = df1.append(new_row, ignore_index=True) # 在Pandas 1.4.0及更高版本中,DataFrame.append() 方法已被弃用
df1 = pd.concat([df1, new_row.to_frame().T], ignore_index=True)
print(df1)
print("*" * 20, "分隔符", "*" * 20)
# 删除行
df1.drop(3, axis=0, inplace=True)
print(df1)
上述代码运行结果如下:
Name Age Salary Bonus
0 Alice 25 50000 5000
1 Bob 30 60000 6000
2 Charlie 35 70000 7000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
3 David 40 80000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
关于有关参数解释:
axis
axis
参数用于指定要删除的是行还是列:
axis=0
:表示沿行方向操作,即删除行。行索引在0轴上,因此设置axis=0
。axis=1
:表示沿列方向操作,即删除列。列索引在1轴上,因此设置axis=1
。
示例:
# 删除行索引为3的行
df1.drop(3, axis=0, inplace=True)
# 删除列名为'Bonus'的列
df1.drop('Bonus', axis=1, inplace=True)
inplace
inplace
参数用于指定操作是否在原DataFrame上进行修改。如果设置为 True
,则会直接修改原DataFrame;如果设置为 False
(默认值),则会返回一个新的DataFrame,原DataFrame保持不变。
示例:
# 在原DataFrame上删除行索引为3的行
df1.drop(3, axis=0, inplace=True)
# 返回一个删除了行索引为3的新DataFrame,原DataFrame不变
new_df = df1.drop(3, axis=0, inplace=False)
基本统计操作
DataFrame提供了丰富的统计函数,如求和、均值、最大值、最小值等。
print(df1.sum()) # 所有列的和
print(df1.mean()) # 所有列的均值
print(df1.max()) # 所有列的最大值
print(df1.min()) # 所有列的最小值
关于求均值时,可能会遇到 不是数值型数据,故此可通过下述方法进行更正:
# 创建一个示例DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Salary': [50000, 60000, 70000]
}
df1 = pd.DataFrame(data)
# 输出原DataFrame
print("原DataFrame:")
print(df1)
# 选择数值类型的列
numeric_df = df1.select_dtypes(include=[float, int])
'''
select_dtypes 方法
select_dtypes 是Pandas中用于选择特定数据类型列的方法。它可以根据数据类型筛选出DataFrame中的列。
include 参数
include 参数指定了要选择的列的数据类型。在这个例子中,include=[float, int] 表示选择所有数据类型为浮点数 (float) 和整数 (int) 的列
'''
# 计算数值类型列的均值
mean_values = numeric_df.mean()
# 输出均值
print("\n数值类型列的均值:")
print(mean_values)
上述代码运行结果如下:
原DataFrame:
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
数值类型列的均值:
Age 30.0
Salary 60000.0
dtype: float64
过滤和条件操作
可以使用条件语句对DataFrame进行过滤操作。
# 过滤年龄大于30的行
filtered_df = df1[df1['Age'] > 30],
print(filtered_df)
'''
其中关于df1['Age'] > 30返回的类型如下
0 False
1 False
2 True
Name: Age, dtype: bool
'''
缺失值处理
DataFrame可以处理缺失值(NaN),并提供了相关的函数来检测和处理这些值。
# 创建一个DataFrame的副本
df_with_nan = df1.copy()
# 将第二行(索引为1)的'Age'列值设为NaN(缺失值)
df_with_nan.at[1, 'Age'] = np.nan
# 检测DataFrame中的缺失值,返回一个布尔类型的DataFrame
print(df_with_nan.isna())
print("*" * 20, "分隔符", "*" * 20)
# 填充DataFrame中的缺失值,用0代替所有NaN
filled_df = df_with_nan.fillna(0)
print(filled_df)
print("*" * 20, "分隔符", "*" * 20)
# 删除包含缺失值的行
dropped_df = df_with_nan.dropna()
print(dropped_df)
上述代码运行结果如下:
Name Age Salary
0 False False False
1 False True False
2 False False False
******************** 分隔符 ********************
Name Age Salary
0 Alice 25.0 50000
1 Bob 0.0 60000
2 Charlie 35.0 70000
******************** 分隔符 ********************
Name Age Salary
0 Alice 25.0 50000
2 Charlie 35.0 70000
DataFrame的应用场景
数据分析与处理
DataFrame非常适合进行数据分析和处理,包括数据清洗、数据转换和特征工程等。
# 数据描述
print(df1.describe())
print("*" * 20, "分隔符", "*" * 20)
# 数据分组和聚合
grouped = df1.groupby('Age').sum()
print(grouped)
print("*" * 20, "分隔符", "*" * 20)
# 数据透视表
pivot_table = df1.pivot_table(values='Salary', index='Name', columns='Age')
print(pivot_table)
上述代码运行结果如下:
Age Salary
count 3.0 3.0
mean 30.0 60000.0
std 5.0 10000.0
min 25.0 50000.0
25% 27.5 55000.0
50% 30.0 60000.0
75% 32.5 65000.0
max 35.0 70000.0
******************** 分隔符 ********************
Name Salary
Age
25 Alice 50000
30 Bob 60000
35 Charlie 70000
******************** 分隔符 ********************
Age 25 30 35
Name
Alice 50000.0 NaN NaN
Bob NaN 60000.0 NaN
Charlie NaN NaN 70000.0
数据可视化
可以结合可视化库如Matplotlib或Seaborn进行数据可视化。
# 创建画布并分割成1行3列的子图
fig, axs = plt.subplots(1, 3, figsize=(18, 5))
# 简单折线图
df1.plot(x='Name', y='Salary', kind='line', ax=axs[0])
axs[0].set_title('Simple Line Plot')
# 条形图
df1.plot(x='Name', y='Salary', kind='bar', ax=axs[1])
axs[1].set_title('Bar Plot')
# 使用Seaborn绘制分布图
sns.histplot(df1['Salary'], ax=axs[2])
axs[2].set_title('Salary Distribution')
# 调整子图间距
plt.tight_layout()
# 显示图形
plt.show()
数据导入和导出
DataFrame可以轻松地从多种数据源导入数据,也可以将数据导出到不同的文件格式。
# 导出到CSV文件
df1.to_csv('output.csv', index=False)
# 导出到Excel文件
df1.to_excel('output.xlsx', index=False)
DataFrame与其他数据结构的比较
- 与Series:Series是一维的,DataFrame是二维的。DataFrame的每一列都是一个Series。
- 与Numpy数组:DataFrame基于Numpy数组构建,但提供了更多的功能,如标签、缺失值处理等。
- 与字典:DataFrame可以看作是一个由Series组成的字典,每个Series代表DataFrame的一列。
结论
DataFrame是Pandas中非常重要的数据结构,提供了丰富的功能和方法,适合处理二维数据。无论是在数据分析、数据清洗还是数据可视化中,DataFrame都能够提供极大的便利。希望通过这篇总结,能够为读者以及自己能够更好地理解和应用DataFrame,更好的在实际学习与工作中应用。
标签:Salary,进阶,Python,Age,df1,DataFrame,print,Name From: https://blog.csdn.net/qq_67696694/article/details/140277826