简介
本全面教程探讨了使用 Python 处理 CSV 数据转换的基本技术。该指南面向开发者和数据分析师,涵盖了使用高级方法和库高效读取、修改和处理 CSV 文件的基本策略。
本全面教程探讨了使用 Python 处理 CSV 数据转换的基本技术。该指南面向开发者和数据分析师,涵盖了使用高级方法和库高效读取、修改和处理 CSV 文件的基本策略。
CSV(逗号分隔值)是一种简单且广泛使用的文件格式,用于存储表格数据。CSV 文件中的每一行代表一行数据,值之间用逗号分隔。这种轻量级格式在不同应用程序和平台之间的数据交换中很受欢迎。
一个典型的 CSV 文件如下所示:
name,age,city
John Doe,30,New York
Jane Smith,25,San Francisco
Mike Johnson,35,Chicago
| 特性 | 描述 |
|---|---|
| 分隔符 | 逗号 (,) 是最常见的,但也可以使用其他分隔符 |
| 数据类型 | 存储文本和数字数据 |
| 简单性 | 易于读写 |
| 兼容性 | 大多数电子表格和数据处理工具都支持 |
Python 提供了用于 CSV 操作的内置库和第三方库:
csv 模块import csv
## 读取 CSV 文件
with open('data.csv', 'r') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
print(row)
## 写入 CSV 文件
with open('output.csv', 'w', newline='') as file:
csv_writer = csv.writer(file)
csv_writer.writerow(['Name', 'Age', 'City'])
csv_writer.writerow(['John Doe', 30, 'New York'])
import pandas as pd
## 读取 CSV 文件
df = pd.read_csv('data.csv')
## 基本数据探索
print(df.head())
print(df.info())
在 LabEx,我们建议将掌握 CSV 处理作为数据处理和分析的一项基本技能。
数据操作是处理 CSV 文件的一项关键技能,涉及各种有效清理、转换和分析数据的技术。
import pandas as pd
## 基本的 CSV 加载
df = pd.read_csv('data.csv')
## 高级加载选项
df = pd.read_csv('data.csv',
delimiter=',',
encoding='utf-8',
header=0,
usecols=['name', 'age', 'city']
)
## 根据条件过滤行
filtered_data = df[df['age'] > 30]
## 多条件过滤
advanced_filter = df[(df['age'] > 25) & (df['city'] == 'New York')]
## 添加新列
df['full_name'] = df['first_name'] + ' ' + df['last_name']
## 对列应用函数
df['age_group'] = df['age'].apply(lambda x: 'Young' if x < 30 else 'Mature')
| 操作 | 描述 | 示例 |
|---|---|---|
| 过滤 | 选择特定的行 | df[df['age'] > 25] |
| 映射 | 转换列值 | df['salary'].map(lambda x: x * 1.1) |
| 分组 | 聚合数据 | df.groupby('city').mean() |
| 合并 | 合并多个数据集 | pd.merge(df1, df2, on='key') |
## 分组和聚合
grouped_data = df.groupby('city').agg({
'age':'mean',
'salary':'sum'
})
## 复杂聚合
pivot_table = df.pivot_table(
values='salary',
index='department',
columns='city',
aggfunc='mean'
)
## 识别缺失值
missing_values = df.isnull().sum()
## 填充缺失值
df['age'].fillna(df['age'].mean(), inplace=True)
## 删除包含缺失数据的行
df_cleaned = df.dropna()
def categorize_age(age):
if age < 20: return 'Teenager'
elif age < 40: return 'Adult'
else: return 'Senior'
df['age_category'] = df['age'].apply(categorize_age)
在 LabEx,我们强调高效且干净的数据操作技术对于从 CSV 数据中提取有意义见解的重要性。
import pandas as pd
## 分块处理大型 CSV 文件
chunk_size = 10000
for chunk in pd.read_csv('large_dataset.csv', chunksize=chunk_size):
## 处理每个数据块
processed_chunk = chunk[chunk['age'] > 25]
processed_chunk.to_csv('filtered_data.csv', mode='a', header=False)
def validate_csv_data(df):
## 检查数据类型
expected_types = {
'name': str,
'age': int,
'salary': float
}
for column, dtype in expected_types.items():
if not pd.api.types.is_dtype_equal(df[column].dtype, dtype):
raise ValueError(f"列 {column} 的数据类型无效")
## 其他验证规则
if (df['age'] < 0).any():
raise ValueError("年龄不能为负数")
return df
def clean_data(df):
## 移除重复项
df.drop_duplicates(inplace=True)
## 标准化文本列
df['name'] = df['name'].str.strip().str.title()
## 处理缺失值
df['salary'].fillna(df['salary'].median(), inplace=True)
return df
| 场景 | 技术 | 示例 |
|---|---|---|
| 去重 | 移除重复项 | df.drop_duplicates() |
| 数据归一化 | 标准化值 | df['column'].str.lower() |
| 异常值检测 | 识别极端值 | df[np.abs(df['age'] - df['age'].mean()) <= (3 * df['age'].std())] |
import numpy as np
import pandas as pd
def optimize_csv_processing(df):
## 将对象列转换为分类列
categorical_columns = ['city', 'department']
for col in categorical_columns:
df[col] = pd.Categorical(df[col])
## 使用更高效的数据类型
df['age'] = pd.to_numeric(df['age'], downcast='integer')
df['salary'] = pd.to_numeric(df['salary'], downcast='float')
return df
def advanced_data_processing(df):
## 多条件复杂过滤
target_df = df[
(df['age'].between(25, 40)) &
(df['salary'] > df['salary'].median()) &
(df['city'].isin(['New York', 'San Francisco']))
]
## 创建派生特征
target_df['salary_tier'] = pd.cut(
target_df['salary'],
bins=[0, 50000, 100000, float('inf')],
labels=['低', '中', '高']
)
return target_df
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def process_csv_safely(input_file, output_file):
try:
df = pd.read_csv(input_file)
processed_df = clean_data(df)
processed_df.to_csv(output_file, index=False)
logger.info(f"成功处理 {input_file}")
except Exception as e:
logger.error(f"处理 {input_file} 时出错: {str(e)}")
在 LabEx,我们建议掌握这些实用技术,以精通 CSV 数据处理。
通过掌握这些 Python CSV 数据转换技术,开发者能够简化数据处理工作流程,实现复杂的数据操作,并提升在各个领域和应用中高效处理结构化数据的能力。