文章目录
- import pandas as pd # 创建示例DataFrame df = pd.DataFrame({ ‘A’: [1, 2, 3], ‘B’: [‘a’, ‘b’, ‘c’], ‘C’: [1.1, 2.2, 3.3] }) # 选择单列 col_a = df[‘A’] # 或 df.A # 选择多列 subset = df[[‘A’, ‘C’]]
- # 筛选A列大于1的行 filtered = df[df[‘A’] > 1] # 多条件筛选 filtered = df[(df[‘A’] > 1) & (df[‘C’] < 3)]
- # 添加简单计算列 df[‘D’] = df[‘A’] * 2 # 添加基于条件的列 df[‘E’] = [‘high’ if x > 1 else ‘low’ for x in df[‘A’]] # 使用apply函数 df[‘F’] = df[‘B’].apply(lambda x: x.upper())
- # 填充缺失值 df_filled = df.fillna(0) # 用0填充 df_filled = df.fillna(df.mean()) # 用均值填充 # 删除包含缺失值的行 df_dropped = df.dropna()
- # 字符串转数值 df[‘A’] = pd.to_numeric(df[‘A’], errors=’coerce’) # 字符串转日期 df[‘date_col’] = pd.to_datetime(df[‘date_str’]) # 分类数据转换 df[‘category_col’] = df[‘text_col’].astype(‘category’)
- from sklearn.preprocessing import MinMaxScaler, StandardScaler # 归一化 (0-1范围) scaler = MinMaxScaler() df[[‘A’, ‘C’]] = scaler.fit_transform(df[[‘A’, ‘C’]]) # 标准化 (均值为0,方差为1) scaler = StandardScaler() df[[‘A’, ‘C’]] = scaler.fit_transform(df[[‘A’, ‘C’]])
- # 等宽分箱 df[‘A_binned’] = pd.cut(df[‘A’], bins=3, labels=[‘low’, ‘medium’, ‘high’]) # 等频分箱 df[‘A_qcut’] = pd.qcut(df[‘A’], q=3, labels=[‘Q1’, ‘Q2’, ‘Q3’])
- # 标签编码 from sklearn.preprocessing import LabelEncoder le = LabelEncoder() df[‘B_encoded’] = le.fit_transform(df[‘B’]) # 独热编码 df_encoded = pd.get_dummies(df, columns=[‘B’])
- # 创建透 视表 pivot_df = df.pivot_table(index=’A’, columns=’B’, values=’C’, aggfunc=’mean’)
- # 将宽格式转换为长格式 id_vars = [‘A’] # 保持不变的列 value_vars = [‘C’] # 要熔化的列 melted_df = pd.melt(df, id_vars=id_vars, value_vars=value_vars)
- # 堆叠(将多列转换为行) stacked_df = df.set_index(‘A’).stack().reset_index() # 解堆叠(将行转换为多列) unstacked_df = stacked_df.set_index([‘A’, ‘level_1’]).unstack().reset_index()
- # 创建第二个DataFrame df2 = pd.DataFrame({ ‘A’: [1, 2, 4], ‘G’: [‘x’, ‘y’, ‘z’] }) # 内连接 merged_inner = pd.merge(df, df2, on=’A’, how=’inner’) # 左连接 merged_left = pd.merge(df, df2, on=’A’, how=’left’)
- # 基于索引的连接 left = df.set_index(‘A’) right = df2.set_index(‘A’) joined = left.join(right, how=’inner’)
- # 垂直拼接 concatenated = pd.concat([df, df2], axis=0, ignore_index=True) # 水平拼接 concatenated = pd.concat([df, df2], axis=1)
目录
- 一、为什么需要数据转换
- 二、基础数据转换操作
- 1. 选择列(特征选择)
- 2. 过滤行(条件筛选)
- 3. 添加新列
- 4. 处理缺失值
- 三、高级数据转换技术
- 1. 数据类型转换
- 2. 数据标准化/归一化
- 3. 离散化/分箱
- 4. 编码分类变量
- 四、数据重塑与重构
- 1. 透 视表(Pivot Table)
- 2. 熔化(Melt)
- 3. 堆叠/解堆叠
- 五、合并与连接数据
- 1. 合并(Merge)
- 2. 连接(Join)
- 3. 拼接(Concat)
- 六、分组与聚合
- 七、时间序列处理
- 八、性能优化技巧
- 九、实际应用案例
- 十、总结
在数据分析和处理的世界里,DataFrame(数据框)是最常用的数据结构之一。无论是使用Python的Pandas库、R语言还是Spark等大数据框架,DataFrame都以其直观的表格形式和强大的操作能力成为数据分析师的首选工具。然而,原始数据往往并不完美,需要进行各种转换才能满足分析需求。本文将深入探讨DataFrame数据转换的核心技巧,帮助你掌握数据处理的魔法钥匙。
数据转换是数据预处理的关键环节,主要目的包括:
- 数据清洗:处理缺失值、异常值和重复数据
- 数据规范化:统一数据格式和单位
- 特征工程:创建新特征或转换现有特征以提高模型性能
- 数据整合:合并多个数据源的数据
- 数据重塑:改变数据结构以适应特定分析需求
import pandas as pd
# 创建示例DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c'],
'C': [1.1, 2.2, 3.3]
})
# 选择单列
col_a = df['A'] # 或 df.A
# 选择多列
subset = df[['A', 'C']]
# 筛选A列大于1的行
filtered = df[df['A'] > 1]
# 多条件筛选
filtered = df[(df['A'] > 1) & (df['C'] < 3)]
# 添加简单计算列
df['D'] = df['A'] * 2
# 添加基于条件的列
df['E'] = ['high' if x > 1 else 'low' for x in df['A']]
# 使用apply函数
df['F'] = df['B'].apply(lambda x: x.upper())
# 填充缺失值
df_filled = df.fillna(0) # 用0填充
df_filled = df.fillna(df.mean()) # 用均值填充
# 删除包含缺失值的行
df_dropped = df.dropna()
# 字符串转数值
df['A'] = pd.to_numeric(df['A'], errors='coerce')
# 字符串转日期
df['date_col'] = pd.to_datetime(df['date_str'])
# 分类数据转换
df['category_col'] = df['text_col'].astype('category')
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# 归一化 (0-1范围)
scaler = MinMaxScaler()
df[['A', 'C']] = scaler.fit_transform(df[['A', 'C']])
# 标准化 (均值为0,方差为1)
scaler = StandardScaler()
df[['A', 'C']] = scaler.fit_transform(df[['A', 'C']])
# 等宽分箱
df['A_binned'] = pd.cut(df['A'], bins=3, labels=['low', 'medium', 'high'])
# 等频分箱
df['A_qcut'] = pd.qcut(df['A'], q=3, labels=['Q1', 'Q2', 'Q3'])
# 标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['B_encoded'] = le.fit_transform(df['B'])
# 独热编码
df_encoded = pd.get_dummies(df, columns=['B'])
# 创建透 视表
pivot_df = df.pivot_table(index='A', columns='B', values='C', aggfunc='mean')
# 将宽格式转换为长格式
id_vars = ['A'] # 保持不变的列
value_vars = ['C'] # 要熔化的列
melted_df = pd.melt(df, id_vars=id_vars, value_vars=value_vars)
# 堆叠(将多列转换为行)
stacked_df = df.set_index('A').stack().reset_index()
# 解堆叠(将行转换为多列)
unstacked_df = stacked_df.set_index(['A', 'level_1']).unstack().reset_index()
# 创建第二个DataFrame
df2 = pd.DataFrame({
'A': [1, 2, 4],
'G': ['x', 'y', 'z']
})
# 内连接
merged_inner = pd.merge(df, df2, on='A', how='inner')
# 左连接
merged_left = pd.merge(df, df2, on='A', how='left')
# 基于索引的连接
left = df.set_index('A')
right = df2.set_index('A')
joined = left.join(right, how='inner')
# 垂直拼接
concatenated = pd.concat([df, df2], axis=0, ignore_index=True)
# 水平拼接
concatenated = pd.concat([df, df2], axis=1)
# 基本分组聚合
grouped = df.groupby('B').agg({
'A': 'sum',
'C': ['mean', 'std']
})
# 多级分组
multi_grouped = df.groupby(['B', pd.cut(df['A'], bins=2)]).size()
# 创建时间索引
df['date'] = pd.date_range('2023-01-01', periods=3)
df = df.set_index('date')
# 重采样
monthly_data = df.resample('M').mean()
# 滚动窗口计算
df['rolling_mean'] = df['C'].rolling(window=2).mean()
- 使用向量化操作:避免循环,尽量使用内置的向量化方法
- 选择合适的数据类型:使用category类型存储低基数分类变量
- 使用chunksize处理大数据:对于超出内存的数据,分块读取和处理
- 使用Dask或Modin:对于超大型DataFrame,考虑使用分布式计算框架
假设我们有一个电商销售数据集,需要进行以下转换:
# 加载数据
sales = pd.read_csv('sales_data.csv')
# 1. 转换日期列
sales['order_date'] = pd.to_datetime(sales['order_date'])
# 2. 提取年月日信息
sales['year'] = sales['order_date'].dt.year
sales['month'] = sales['order_date'].dt.month
sales['day'] = sales['order_date'].dt.day
# 3. 创建价格区间列
bins = [0, 50, 100, 200, float('inf')]
labels = ['0-50', '51-100', '101-200', '200+']
sales['price_range'] = pd.cut(sales['price'], bins=bins, labels=labels)
# 4. 计算每个客户的总消费
customer_spending = sales.groupby('customer_id')['amount'].sum().reset_index()
customer_spending.rename(columns={'amount': 'total_spending'}, inplace=True)
# 5. 合并回原数据集
sales = pd.merge(sales, customer_spending, on='customer_id', how='left')
DataFrame数据转换是数据分析流程中不可或缺的环节。掌握这些技术不仅能帮你清理和准备数据,还能为后续的分析和建模工作奠定坚实基础。从简单的列选择和行过滤,到复杂的分组聚合和透 视操作,每一种转换技术都有其特定的应用场景。
记住,数据转换不仅仅是技术操作,更是理解数据、发现数据中模式和关系的过程。随着实践经验的积累,你会逐渐形成自己的数据转换套路,能够根据不同的分析需求快速设计出高效的数据处理流程。
到此这篇关于从基础到高级详解Python中的DataFrame数据转换的文章就介绍到这了,更多相关DataFrame数据转换内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- python中使用dataframe二维数据转换为三维数据的几种方法
- Python Pandas实现将嵌套JSON数据转换DataFrame
- Python中DataFrame与内置数据结构相互转换的实现
- Pandas将列表(List)转换为数据框(Dataframe)