Python进阶入门之DataFrame

引言

接上一篇《关于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,更好的在实际学习与工作中应用。

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值