【Python】Pandas:数据处理

Pandas 是一个功能强大且广泛使用的 Python 数据分析库,特别适用于处理结构化数据。它提供了高效的数据结构和分析工具,能够使数据处理和分析变得更加简单和直观。

生成对象

创建 Series

Series 是 Pandas 中的基本数据结构之一,它是一种带标签的一维数组,可以存储任意数据类型。

import pandas as pd

s = pd.Series([1, 3, 5, 7, 9])
print(s)

在这个例子中,我们创建了一个简单的 Series,它包含了几个整数。Series 默认使用整数索引,索引从 0 开始。输出如下:

0    1
1    3
2    5
3    7
4    9
dtype: int64

创建 DataFrame

DataFrame 是 Pandas 中的核心数据结构,可以理解为一个二维的表格,其中包含行和列。

data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)

在这个例子中,我们使用一个字典来创建 DataFrame。字典的键是列名,值是列中的数据。输出如下:

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

查看数据

查看前几行数据

你可以使用 head() 方法查看 DataFrame 的前几行,这在检查数据导入是否正确时非常有用。

print(df.head())

head() 默认显示前 5 行。如果 DataFrame 的行数少于 5 行,则会显示所有行。结果如下:

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

查看数据的基本信息

info() 方法提供了关于 DataFrame 的基本信息,包括行数、列数、各列的数据类型以及是否有缺失值。

print(df.info())

info() 的输出帮助你快速了解数据的结构,特别是在处理大型数据集时非常有用。结果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   Name    3 non-null      object
 1   Age     3 non-null      int64
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes

描述性统计

使用 describe() 方法可以快速生成数值列的基本统计信息,如平均值、标准差、最小值和最大值等。

print(df.describe())

describe() 只会对数值型列进行操作,输出如下:

             Age
count   3.000000
mean   30.000000
std     5.000000
min    25.000000
25%    27.500000
50%    30.000000
75%    32.500000
max    35.000000

数据选择

获取数据

可以通过列名直接选择单列或多列数据。

age_column = df['Age']
print(age_column)

subset = df[['Name', 'Age']]
print(subset)

选择单列时,结果是一个 Series,选择多列时,结果是一个 DataFrame。输出如下:

0    25
1    30
2    35
Name: Age, dtype: int64

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

按标签选择

使用 .loc[] 方法可以根据行和列的标签来选择数据。

print(df.loc[0])  # 选择第一行数据
print(df.loc[0, 'Name'])  # 选择第一行的 'Name' 列

.loc[] 提供了强大的标签选择能力,适用于需要精确定位数据的场景。输出如下:

Name    Alice
Age        25
Name: 0, dtype: object

Alice

布尔索引

布尔索引允许你通过条件来筛选数据。

adults = df[df['Age'] > 30]
print(adults)

在这个例子中,我们筛选出年龄大于 30 的行。结果如下:

      Name  Age
2  Charlie   35

赋值

你可以轻松地修改 DataFrame 中的数据。

df.loc[0, 'Age'] = 26
print(df)

在这个例子中,我们将 Alice 的年龄从 25 改为 26。修改后的 DataFrame 如下:

      Name  Age
0    Alice   26
1      Bob   30
2  Charlie   35

删除数据

drop 是一个常用方法,适用于从 DataFrame 中删除特定的行或列。它可以根据标签或位置来删除元素。

  • labels:要删除的行或列的标签,可以是一个字符串或列表。
  • axisaxis=0 表示删除行,axis=1 表示删除列。
  • inplace(可选,默认为 False):如果设置为 True,将直接在原始 DataFrame 中修改,而不是返回一个新对象。
df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [26, 30, 22]
})

# 删除列
df = df.drop(columns=['age'])

# 删除行
df = df.drop([1])
print(df)
   id     name
0   1    Alice
2   3  Charlie
  • df.drop(columns=['age']) 删除了 age 列。
  • df.drop([1]) 删除了索引为 1 的那一行。
  • drop 方法灵活易用,在数据清理时非常实用。

处理缺失值

检测缺失值

使用 isna() 方法可以检查 DataFrame 中的缺失值。

print(df.isna())

isna() 返回与 DataFrame 大小相同的布尔值 DataFrame,指示每个元素是否为缺失值。输出如下:

    Name    Age
0  False  False
1  False  False
2  False  False

删除缺失值

使用 dropna() 方法可以删除包含缺失值的行或列。

df_cleaned = df.dropna()
print(df_cleaned)

dropna() 默认删除任何包含缺失值的行。由于示例数据没有缺失值,因此结果不变。

填充缺失值

使用 fillna() 方法可以为缺失值填充默认值。

df_filled = df.fillna(0)
print(df_filled)

fillna() 将所有缺失值替换为指定的值(此处为 0)。这在数据分析前的预处理中非常有用。

基本运算

统计运算

Pandas 提供了许多内置的统计方法,如均值、总和、最大值等。

mean_age = df['Age'].mean()
print(mean_age)

在这个例子中,我们计算了 Age 列的平均值,结果为 30。

Apply 函数

apply() 方法允许你对 DataFrame 的每个元素或列应用自定义函数。

df['Age_Doubled'] = df['Age'].apply(lambda x: x * 2)
print(df)

在这个例子中,我们将 Age 列中的每个值都乘以 2,结果如下:

      Name  Age  Age_Doubled
0    Alice   26           52
1      Bob   30           60
2  Charlie   35           70

直方图

使用 Pandas 的内置绘图功能可以快速生成直方图。

df['Age'].hist()

此代码将 Age 列绘制为直方图,是快速可视化数据分布的好方法。

字符串方法

Pandas 提供了一组强大的字符串操作方法,适用于文本数据处理。

df['Name_Upper'] = df['Name'].str.upper()
print(df)

在这个例子中,我们将 Name 列中的所有字符串转换为大写,结果如下:

      Name  Age  Age_Doubled Name_Upper
0    Alice   26           52      ALICE
1      Bob   30           60        BOB
2  Charlie   35           70    CHARLIE

数据合并(Merge)

在数据分析过程中,经常需要将多个数据集合并到一起,以便进行综合分析。Pandas 提供了多种方法来合并数据,包括 concat()merge()append() 等。下面将详细介绍这些方法的使用,并通过示例说明它们的功能。

结合(Concat)

concat() 方法用于沿指定轴将多个 DataFrame 组合在一起。它可以沿着行轴(纵向)或列轴(横向)将数据拼接成一个新的 DataFrame

沿行轴拼接数据
import pandas as pd

# 创建两个示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# 沿行轴拼接
combined = pd.concat([df1, df2])

print(combined)

输出结果如下:

   A  B
0  1  3
1  2  4
0  5  7
1  6  8

在这个示例中,我们将 df1df2 沿行轴拼接。注意,拼接后的 DataFrame 保留了原始的行索引。为了重置索引,可以使用 ignore_index=True 参数。

沿列轴拼接数据
combined_columns = pd.concat([df1, df2], axis=1)

print(combined_columns)

输出结果如下:

   A  B  A  B
0  1  3  5  7
1  2  4  6  8

在这个示例中,我们通过设置 axis=1 沿列轴拼接数据,结果是将两个 DataFrame 并排放置,形成一个新的 DataFrame

连接(Join)

merge() 方法类似于 SQL 中的 JOIN 操作,用于将两个 DataFrame 按照某一列或多列进行合并。merge() 可以实现多种连接方式,如内连接、左连接、右连接和外连接。

内连接
import pandas as pd

# 创建两个示例 DataFrame
df_left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
df_right = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'B': ['B0', 'B1', 'B2']})

# 基于 'key' 列进行内连接
merged = df_left.merge(df_right, on='key')

print(merged)

输出结果如下:

  key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2

在这个示例中,我们根据 key 列将 df_leftdf_right 进行内连接,结果只保留了在 key 列上匹配的行。

左连接
df_left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
df_right = pd.DataFrame({'key': ['K1', 'K2', 'K3'], 'B': ['B1', 'B2', 'B3']})

# 基于 'key' 列进行左连接
merged_left = df_left.merge(df_right, on='key', how='left')

print(merged_left)

输出结果如下:

  key   A    B
0  K0  A0  NaN
1  K1  A1   B1
2  K2  A2   B2

在这个示例中,我们根据 key 列进行左连接。左连接会保留 df_left 中的所有行,如果 df_right 中没有匹配的行,则在 B 列中填充 NaN

追加(Append)

append() 方法用于在现有 DataFrame 上追加新行。它与 concat() 的功能类似,但更适合用于在数据分析过程中动态地追加单个或多个行。

追加新行
import pandas as pd

# 创建一个示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [26, 30, 35]
})

# 添加新行
df_new = df.append({'Name': 'David', 'Age': 40}, ignore_index=True)

print(df_new)

输出结果如下:

      Name  Age
0    Alice   26
1      Bob   30
2  Charlie   35
3    David   40

在这个示例中,我们向 df 追加了一行新数据,其中包含了 David 的信息。通过设置 ignore_index=True,新行的索引被自动调整为顺序编号。

文件读写

CSV 文件

Pandas 提供了方便的方法来读写 CSV 文件。

df.to_csv('output.csv')
df_from_csv = pd.read_csv('output.csv')
print(df_from_csv)

在这个例子中,我们将 DataFrame 导出为 CSV 文件,并再次读取。CSV 是最常用的数据存储格式之一。

Excel 文件

除了 CSV,Pandas 还支持 Excel 文件的读写。

df.to_excel('output.xlsx')
df_from_excel = pd.read_excel('output.xlsx')
print(df_from_excel)

在这个例子中,我们将 DataFrame 导出为 Excel 文件,并再次读取。Excel 文件广泛用于数据共享和报告。

复杂数据处理

展平嵌套结构的数据:pd.json_normalize

pd.json_normalize 是一个用于展平嵌套 JSON 数据的函数。它将嵌套字典或列表结构的数据转换为平面表格,非常适合从 API 响应或嵌套的配置文件中提取数据。

  • data:输入的数据,可以是一个字典或字典的列表。
  • record_path(可选):用于指定嵌套数据中的列表(如果存在),将其展开为多行。
  • meta(可选):用于指定需要保留的额外字段,这些字段通常位于展开列表的上一级。
  • sep(可选,默认为 .):设置嵌套字段的分隔符。你可以使用下划线(_)、点号(.)等。
import pandas as pd

data = [
    {
        "id": 1,
        "name": "Alice",
        "info": {
            "age": 26,
            "address": {
                "city": "New York",
                "zip": "10001"
            }
        }
    }
]

df = pd.json_normalize(data, sep='_')
print(df)
   id   name  info_age info_address_city info_address_zip
0   1  Alice       26           New York          10001

解释

  • 使用 sep='_' 将嵌套字段展平,字段名由上层字段名与下层字段名组成。
  • 该方法在处理 API 返回的嵌套 JSON 数据时非常有效。

将字典列表转换为 DataFrame:pd.DataFrame.from_records

from_records 方法用于将字典列表或结构化数组转换为 DataFrame,特别适合处理嵌套字典的数据源。可以通过指定列名来控制输出。

  • data:输入数据,通常是字典的列表。
  • columns(可选):指定想要保留的列名。
data = [
    {"id": 1, "name": "Alice", "info": {"age": 26, "city": "New York"}},
    {"id": 2, "name": "Bob", "info": {"age": 30, "city": "Los Angeles"}}
]

df = pd.DataFrame.from_records(data, columns=["id", "name", "info"])
df_info = pd.DataFrame.from_records(df['info'].tolist())
df = df.drop(columns=['info']).join(df_info)
print(df)
   id   name  age         city
0   1  Alice   26     New York
1   2    Bob   30  Los Angeles
  • 使用 from_records 将字典列表转化为 DataFrame,然后对 info 列中的嵌套字典进行进一步处理。
  • 通过 df.drop()df.join(),可以将处理后的数据与原始 DataFrame 合并。

展开列表数据为多行:pd.DataFrame.explode

explode 方法用于将包含列表的列展开为多行。这在处理单个字段内包含多个值时非常有用,例如处理一列内的多项选择或多条记录。

  • column:指定需要展开的列名。
df = pd.DataFrame({
    'id': [1, 2],
    'name': ['Alice', 'Bob'],
    'scores': [[85, 90, 95], [88, 92, 96]]
})

df_exploded = df.explode('scores')
print(df_exploded)
   id   name  scores
0   1  Alice      85
0   1  Alice      90
0   1  Alice      95
1   2    Bob      88
1   2    Bob      92
1   2    Bob      96
  • explodescores 列中的列表拆分为多行,每个元素对应一行。
  • 常用于数据预处理和分析中,将列表数据转化为可用的表格形式。

使用 applylambda 逐行处理数据

apply 配合 lambda 函数,可以对 DataFrame 的每一行或每一列执行自定义操作。对于复杂数据结构(如嵌套字典或列表),它提供了灵活的处理方式。

  • func:用于对每一行或每一列执行的函数,通常使用 lambda 表达式进行处理。
  • axisaxis=0 代表按列应用函数,axis=1 代表按行应用函数。
df = pd.DataFrame({
    'id': [1, 2],
    'info': [{'age': 26, 'city': 'New York'}, {'age': 30, 'city': 'Los Angeles'}]
})

df['city'] = df['info'].apply(lambda x: x['city'])
print(df)
   id                         info          city
0   1  {'age': 26, 'city': 'New York'}     New York
1   2  {'age': 30, 'city': 'Los Angeles'} Los Angeles
  • apply(lambda x: x['city']) 提取嵌套字典中的 city 信息,并将其放入新的 city 列中。
  • apply 是一种强大的工具,能够灵活地处理自定义数据操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值