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:要删除的行或列的标签,可以是一个字符串或列表。
- axis:
axis=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
在这个示例中,我们将 df1
和 df2
沿行轴拼接。注意,拼接后的 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_left
和 df_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
explode
将scores
列中的列表拆分为多行,每个元素对应一行。- 常用于数据预处理和分析中,将列表数据转化为可用的表格形式。
使用 apply
和 lambda
逐行处理数据
apply
配合 lambda
函数,可以对 DataFrame 的每一行或每一列执行自定义操作。对于复杂数据结构(如嵌套字典或列表),它提供了灵活的处理方式。
- func:用于对每一行或每一列执行的函数,通常使用
lambda
表达式进行处理。 - axis:
axis=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
是一种强大的工具,能够灵活地处理自定义数据操作。