Pandas是Python中一个强大的数据分析库,其灵活高效的数据处理能力深受数据科学家和数据分析师的喜爱。在Pandas中,数据通常以DataFrame(二维表格)和Series(一维序列)的形式存储和操作。本文旨在帮助初学者快速上手Pandas,掌握DataFrame中行与列的基本操作,并提供一些优化技巧,以便在实际工作中更高效地使用Pandas。
一、Pandas安装与导入
在使用Pandas之前,需要先确保已安装该库。可以使用pip命令进行安装:
pip install pandas
安装完成后,导入Pandas库:
import pandas as pd
二、创建DataFrame
DataFrame是Pandas中最常用的数据结构,它类似于Excel中的表格,包含行和列。以下是一些创建DataFrame的常见方法:
从字典创建:
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
print(df)
输出结果:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
从列表的列表创建:
data = [
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
['Charlie', 35, 'Chicago']
]
columns = ['Name', 'Age', 'City']
df = pd.DataFrame(data, columns=columns)
print(df)
输出结果同上。
从CSV文件创建:
df = pd.read_csv('data.csv')
print(df)
注意:这里假设data.csv文件与Python脚本在同一目录下,且文件内容格式正确。
三、行与列的基本操作
- 选择行与列
选择单列:
print(df['Name'])
输出结果:
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
选择多列:
print(df[['Name', 'City']])
输出结果:
Name City
0 Alice New York
1 Bob Los Angeles
2 Charlie Chicago
选择单行:
print(df.loc[0])
输出结果:
Name Alice
Age 25
City New York
Name: 0, dtype: object
选择多行:
print(df.loc[[0, 2]])
输出结果:
Name Age City
0 Alice 25 New York
2 Charlie 35 Chicago
按条件选择行:
print(df[df['Age'] > 30])
输出结果:
Name Age City
2 Charlie 35 Chicago
- 添加行与列
添加单列:
df['Salary'] = [70000, 80000, 90000]
print(df)
输出结果:
Name Age City Salary
0 Alice 25 New York 70000
1 Bob 30 Los Angeles 80000
2 Charlie 35 Chicago 90000
添加多列:
new_columns = {'Occupation': ['Engineer', 'Doctor', 'Lawyer'], 'Experience': [5, 8, 10]}
df = df.assign(**new_columns)
print(df)
输出结果:
Name Age City Salary Occupation Experience
0 Alice 25 New York 70000 Engineer 5
1 Bob 30 Los Angeles 80000 Doctor 8
2 Charlie 35 Chicago 90000 Lawyer 10
添加单行:
new_row = {'Name': 'David', 'Age': 40, 'City': 'Houston', 'Salary': 100000, 'Occupation': 'Architect', 'Experience': 12}
df = df.append(new_row, ignore_index=True)
print(df)
输出结果:
Name Age City Salary Occupation Experience
0 Alice 25 New York 70000 Engineer 5
1 Bob 30 Los Angeles 80000 Doctor 8
2 Charlie 35 Chicago 90000 Lawyer 10
3 David 40 Houston 100000 Architect 12
- 删除行与列
删除单列:
df = df.drop(columns=['Salary'])
print(df)
输出结果:
Name Age City Occupation Experience
0 Alice 25 New York Engineer 5
1 Bob 30 Los Angeles Doctor 8
2 Charlie 35 Chicago Lawyer 10
3 David 40 Houston Architect 12
删除多列:
df = df.drop(columns=['Occupation', 'Experience'])
print(df)
输出结果:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
3 David 40 Houston
删除单行:
df = df.drop(index=0)
print(df)
输出结果:
Name Age City
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
3 David 40 Houston
删除多行:
df = df.drop(index=[1, 3])
print(df)
输出结果:
Name Age City
2 Charlie 35 Chicago
四、优化技巧
- 使用链式操作
Pandas支持链式操作,即将多个操作组合在一起,提高代码的可读性和效率。例如:
df = (
pd.read_csv('data.csv')
.drop(columns=['UnneededColumn1', 'UnneededColumn2'])
.rename(columns={'OldColumnName': 'NewColumnName'})
.query('Age > 30')
)
print(df)
- 避免使用循环
Pandas的内置函数通常比Python原生的循环更高效。尽量避免在DataFrame上使用循环操作,而是利用Pandas的向量化操作。例如,计算每行的和:
不推荐的方式(低效)
for index, row in df.iterrows():
sum_row = row['Column1'] + row['Column2'] + row['Column3']
# do something with sum_row
推荐的方式(高效)
df['Sum'] = df[['Column1', 'Column2', 'Column3']].sum(axis=1)
- 使用loc和iloc进行精确选择
loc基于标签选择数据,而iloc基于整数位置选择数据。在需要精确选择数据时,使用这两个函数可以提高代码的清晰度和性能。例如:
选择年龄大于30且职业为Doctor的行
df_filtered = df.loc[(df['Age'] > 30) & (df['Occupation'] == 'Doctor')]
选择前两行
df_first_two = df.iloc[:2]
- 使用apply函数进行自定义操作
apply函数允许对DataFrame的列或行应用自定义函数。这在处理复杂逻辑时非常有用。例如,计算每行的平均年龄(假设有多列年龄数据):
def calculate_average_age(row):
age_columns = ['Age1', 'Age2', 'Age3'] # 假设这些列存在
return row[age_columns].mean()
df['AverageAge'] = df.apply(calculate_average_age,axis=1)
print(df)
在这个例子中,calculate_average_age 函数计算了每行中指定年龄列的平均值,并将结果存储在新的列 AverageAge 中。axis=1 参数指定函数应用于行而不是列。
- 使用向量化字符串操作
Pandas 提供了许多针对字符串的向量化操作,这些操作通常比使用 Python 的循环或列表推导式更快。例如,要将所有城市名称转换为大写:
df['City'] = df['City'].str.upper()
print(df)
- 使用合适的数据类型
确保 DataFrame 中的列使用合适的数据类型,因为数据类型会影响性能。例如,将整数列存储为整数类型而不是浮点数或对象类型。可以使用 astype 方法转换数据类型:
df['Age'] = df['Age'].astype(int)
print(df.dtypes)
使用 Dask 或 Modin 进行大规模数据处理
对于非常大的数据集,Pandas 可能会变得缓慢或内存不足。在这种情况下,可以考虑使用 Dask 或 Modin,这两个库提供了与 Pandas 兼容的 API,但能够处理更大规模的数据集。优化读取和写入文件
当从文件读取数据或写入数据时,可以通过调整参数来优化性能。例如,使用 read_csv 的 nrows 参数限制读取的行数,或使用 chunksize 参数分块读取大文件。
分块读取大文件
chunks = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunks:
# 处理每个块
pass
- 利用索引
Pandas 的索引不仅用于快速访问数据,还可以加速数据操作。确保为经常用作过滤条件的列设置索引,或者使用 set_index 方法将列转换为索引。
df.set_index('Name', inplace=True)
print(df)
- 使用查询(query)方法
query 方法允许使用字符串表达式来查询数据,这可以提高代码的可读性。例如:
df_filtered = df.query('Age > 30 and Occupation == "Doctor"')
print(df_filtered)
总结:
Pandas 是一个功能强大的数据分析库,提供了丰富的工具和函数来处理数据。通过掌握行与列的基本操作以及上述优化技巧,你可以更高效地使用 Pandas 来处理和分析数据。记住,在实际工作中,不断优化你的代码和数据处理流程是非常重要的。