| 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
1. pandas shape基础介绍 
 
在数据分析的世界里,了解数据集的规模是首要任务之一。pandas作为Python数据分析的核心库,提供了shape属性,让我们能够快速获取数据集的维度信息。shape属性返回一个元组,表示DataFrame或Series的维度,对于DataFrame,它返回(行数, 列数),而对于一维的Series,则返回(元素数,)。 
 
shape属性是pandas中最基础但也是最常用的属性之一。无论是数据清洗、数据转换还是数据分析,了解数据的形状都是必不可少的一步。通过shape,我们可以快速了解数据集的大小,判断数据是否加载正确,以及在进行各种操作后验证数据的维度变化。 
 
2. 如何使用shape属性 
 
使用shape属性非常简单,只需在DataFrame或Series对象后加上.shape即可。让我们通过一些示例来详细了解: 
- import pandas as pd
 - import numpy as np
 - # 创建一个简单的DataFrame
 - data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
 -         'Age': [25, 30, 35, 40],
 -         'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']}
 - df = pd.DataFrame(data)
 - # 获取DataFrame的形状
 - print("DataFrame的形状:", df.shape)
 - # 输出: DataFrame的形状: (4, 3)
 - # 创建一个Series
 - s = pd.Series([1, 2, 3, 4, 5])
 - # 获取Series的形状
 - print("Series的形状:", s.shape)
 - # 输出: Series的形状: (5,)
 
  复制代码 
shape返回的是一个元组,我们可以分别获取行数和列数: 
- # 获取行数
 - rows = df.shape[0]
 - print("行数:", rows)  # 输出: 行数: 4
 - # 获取列数
 - cols = df.shape[1]
 - print("列数:", cols)  # 输出: 列数: 3
 
  复制代码 
这种分离获取行列数的方式在后续的数据处理中非常有用,特别是在循环或条件判断中。 
 
3. shape在实际数据分析中的应用场景 
 
shape属性在数据分析的各个阶段都有广泛的应用,以下是几个常见的应用场景: 
 
3.1 数据加载验证 
 
在加载数据后,我们通常需要确认数据是否正确加载: 
- # 从CSV文件加载数据
 - df = pd.read_csv('large_dataset.csv')
 - # 检查数据形状
 - print("数据集形状:", df.shape)
 - # 预期数据集应该有10000行和20列
 - if df.shape != (10000, 20):
 -     print("警告: 数据集形状不符合预期!")
 - else:
 -     print("数据集加载成功!")
 
  复制代码 
3.2 数据清洗后的验证 
 
数据清洗过程中,我们可能会删除一些行或列,使用shape可以验证操作是否按预期进行: 
- # 原始数据形状
 - print("原始数据形状:", df.shape)
 - # 删除含有缺失值的行
 - df_cleaned = df.dropna()
 - # 清洗后数据形状
 - print("清洗后数据形状:", df_cleaned.shape)
 - # 计算删除的行数
 - removed_rows = df.shape[0] - df_cleaned.shape[0]
 - print(f"删除了 {removed_rows} 行含有缺失值的数据")
 
  复制代码 
3.3 数据分割验证 
 
在机器学习中,我们经常需要将数据集分为训练集和测试集,shape可以帮助我们验证分割是否正确: 
- from sklearn.model_selection import train_test_split
 - # 假设df是我们的数据集
 - X = df.drop('target', axis=1)  # 特征
 - y = df['target']  # 目标变量
 - # 将数据分为训练集和测试集,比例为7:3
 - X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
 - # 验证分割结果
 - print("训练集特征形状:", X_train.shape)
 - print("测试集特征形状:", X_test.shape)
 - print("训练集目标形状:", y_train.shape)
 - print("测试集目标形状:", y_test.shape)
 - # 检查分割比例是否正确
 - train_ratio = X_train.shape[0] / df.shape[0]
 - test_ratio = X_test.shape[0] / df.shape[0]
 - print(f"训练集比例: {train_ratio:.2f}")
 - print(f"测试集比例: {test_ratio:.2f}")
 
  复制代码 
4. 结合shape使用的高效技巧 
 
除了基本的使用方法,还有一些结合shape的高效技巧可以提升我们的数据分析效率: 
 
4.1 条件筛选后的数据量统计 
 
我们可以使用shape来快速统计满足特定条件的数据量: 
- # 假设我们有一个包含销售数据的DataFrame
 - sales_data = pd.DataFrame({
 -     'Product': ['A', 'B', 'A', 'C', 'B', 'A'],
 -     'Sales': [100, 150, 200, 50, 300, 250],
 -     'Region': ['North', 'South', 'East', 'West', 'North', 'South']
 - })
 - # 统计产品A的销售记录数量
 - product_a_count = sales_data[sales_data['Product'] == 'A'].shape[0]
 - print(f"产品A的销售记录数量: {product_a_count}")
 - # 统计销售额超过200的记录数量
 - high_sales_count = sales_data[sales_data['Sales'] > 200].shape[0]
 - print(f"销售额超过200的记录数量: {high_sales_count}")
 - # 统计北部地区且销售额超过100的记录数量
 - north_high_sales_count = sales_data[(sales_data['Region'] == 'North') & (sales_data['Sales'] > 100)].shape[0]
 - print(f"北部地区且销售额超过100的记录数量: {north_high_sales_count}")
 
  复制代码 
4.2 动态调整数据结构 
 
有时我们需要根据数据的形状动态调整数据处理逻辑: 
- def process_data(df):
 -     # 根据数据形状选择不同的处理方式
 -     if df.shape[1] > 10:  # 如果列数超过10
 -         print("数据集列数较多,使用降维处理...")
 -         # 这里可以添加降维代码
 -     elif df.shape[0] > 10000:  # 如果行数超过10000
 -         print("数据集行数较多,使用分批处理...")
 -         # 这里可以添加分批处理代码
 -     else:
 -         print("数据集规模适中,使用常规处理...")
 -         # 这里可以添加常规处理代码
 -     
 -     return df
 - # 测试函数
 - large_df = pd.DataFrame(np.random.rand(15000, 5))  # 15000行5列的数据
 - process_data(large_df)
 - wide_df = pd.DataFrame(np.random.rand(100, 15))  # 100行15列的数据
 - process_data(wide_df)
 
  复制代码 
4.3 内存使用优化 
 
对于大型数据集,我们可以根据shape来优化内存使用: 
- def optimize_memory(df):
 -     # 获取数据形状
 -     rows, cols = df.shape
 -     
 -     # 如果数据集很大,考虑使用更高效的数据类型
 -     if rows > 1000000:  # 超过100万行
 -         print("检测到大型数据集,优化内存使用...")
 -         
 -         # 遍历每一列
 -         for col in df.columns:
 -             col_type = df[col].dtype
 -             
 -             # 如果是整数类型
 -             if col_type == 'int64':
 -                 # 检查值的范围,使用最小够用的整数类型
 -                 col_min = df[col].min()
 -                 col_max = df[col].max()
 -                 
 -                 if col_min > np.iinfo(np.int8).min and col_max < np.iinfo(np.int8).max:
 -                     df[col] = df[col].astype(np.int8)
 -                 elif col_min > np.iinfo(np.int16).min and col_max < np.iinfo(np.int16).max:
 -                     df[col] = df[col].astype(np.int16)
 -                 elif col_min > np.iinfo(np.int32).min and col_max < np.iinfo(np.int32).max:
 -                     df[col] = df[col].astype(np.int32)
 -             
 -             # 如果是浮点数类型
 -             elif col_type == 'float64':
 -                 df[col] = df[col].astype(np.float32)
 -     
 -     return df
 - # 创建一个大型DataFrame
 - large_df = pd.DataFrame({
 -     'id': range(1, 2000000),
 -     'value': np.random.rand(2000000),
 -     'category': np.random.choice(['A', 'B', 'C', 'D'], size=2000000)
 - })
 - # 优化前内存使用
 - print("优化前内存使用:", large_df.memory_usage(deep=True).sum() / 1024**2, "MB")
 - # 优化内存
 - optimized_df = optimize_memory(large_df.copy())
 - # 优化后内存使用
 - print("优化后内存使用:", optimized_df.memory_usage(deep=True).sum() / 1024**2, "MB")
 
  复制代码 
5. shape与其他pandas功能的结合使用 
 
shape属性可以与pandas的其他功能结合使用,发挥更大的威力: 
 
5.1 与groupby结合使用 
 
我们可以使用shape来统计分组后的数据量: 
- # 创建一个示例DataFrame
 - df = pd.DataFrame({
 -     'Department': ['HR', 'IT', 'Finance', 'HR', 'IT', 'Finance', 'HR'],
 -     'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
 -     'Salary': [70000, 80000, 90000, 75000, 85000, 95000, 72000]
 - })
 - # 按部门分组并统计每个部门的员工数量
 - dept_counts = df.groupby('Department').size()
 - print("每个部门的员工数量:")
 - print(dept_counts)
 - # 使用shape获取每个部门的员工数量
 - dept_counts_shape = df.groupby('Department').apply(lambda x: x.shape[0])
 - print("\n使用shape统计的每个部门的员工数量:")
 - print(dept_counts_shape)
 
  复制代码 
5.2 与pivot_table结合使用 
 
在创建透视表后,我们可以使用shape来了解透视表的维度: 
- # 创建一个更复杂的示例DataFrame
 - df = pd.DataFrame({
 -     'Date': pd.date_range(start='2023-01-01', periods=12, freq='M'),
 -     'Product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
 -     'Region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'North', 'South', 'South'],
 -     'Sales': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650]
 - })
 - # 创建透视表
 - pivot = pd.pivot_table(df, values='Sales', index='Product', columns='Region', aggfunc='sum')
 - # 查看透视表的形状
 - print("透视表的形状:", pivot.shape)
 - print("透视表内容:")
 - print(pivot)
 - # 检查透视表是否为空
 - if pivot.shape == (0, 0):
 -     print("警告: 透视表为空!")
 - else:
 -     print("透视表创建成功!")
 
  复制代码 
5.3 与concat/merge结合使用 
 
在合并或连接数据后,我们可以使用shape来验证操作结果: 
- # 创建两个DataFrame
 - df1 = pd.DataFrame({
 -     'ID': [1, 2, 3],
 -     'Name': ['Alice', 'Bob', 'Charlie']
 - })
 - df2 = pd.DataFrame({
 -     'ID': [4, 5, 6],
 -     'Name': ['David', 'Eve', 'Frank']
 - })
 - # 垂直合并(行合并)
 - concat_vertical = pd.concat([df1, df2], axis=0)
 - print("垂直合并后的形状:", concat_vertical.shape)
 - print("垂直合并结果:")
 - print(concat_vertical)
 - # 创建另外两个DataFrame用于水平合并
 - df3 = pd.DataFrame({
 -     'ID': [1, 2, 3],
 -     'Name': ['Alice', 'Bob', 'Charlie']
 - })
 - df4 = pd.DataFrame({
 -     'Age': [25, 30, 35],
 -     'City': ['New York', 'Los Angeles', 'Chicago']
 - })
 - # 水平合并(列合并)
 - concat_horizontal = pd.concat([df3, df4], axis=1)
 - print("\n水平合并后的形状:", concat_horizontal.shape)
 - print("水平合并结果:")
 - print(concat_horizontal)
 - # 使用merge进行合并
 - df5 = pd.DataFrame({
 -     'ID': [1, 2, 3],
 -     'Salary': [50000, 60000, 70000]
 - })
 - merge_result = pd.merge(df3, df5, on='ID')
 - print("\n合并后的形状:", merge_result.shape)
 - print("合并结果:")
 - print(merge_result)
 
  复制代码 
6. 实际案例分析 
 
让我们通过一个实际的数据分析案例来综合运用shape属性的各种技巧: 
- # 假设我们有一个销售数据集
 - # 首先创建一个模拟数据集
 - np.random.seed(42)
 - dates = pd.date_range(start='2022-01-01', end='2022-12-31')
 - products = ['A', 'B', 'C', 'D', 'E']
 - regions = ['North', 'South', 'East', 'West']
 - # 生成随机销售数据
 - data = []
 - for date in dates:
 -     for product in products:
 -         for region in regions:
 -             sales = np.random.randint(100, 1000)
 -             data.append([date, product, region, sales])
 - sales_df = pd.DataFrame(data, columns=['Date', 'Product', 'Region', 'Sales'])
 - # 查看数据集的基本信息
 - print("数据集形状:", sales_df.shape)
 - print("前5行数据:")
 - print(sales_df.head())
 - # 1. 数据清洗
 - # 检查是否有缺失值
 - print("\n缺失值统计:")
 - print(sales_df.isnull().sum())
 - # 假设我们发现有一些异常值(销售额为0)
 - zero_sales = sales_df[sales_df['Sales'] == 0]
 - print(f"\n销售额为0的记录数量: {zero_sales.shape[0]}")
 - # 删除销售额为0的记录
 - sales_df_cleaned = sales_df[sales_df['Sales'] > 0]
 - print(f"清洗后的数据集形状: {sales_df_cleaned.shape}")
 - # 2. 数据分析
 - # 按产品统计总销售额和销售次数
 - product_stats = sales_df_cleaned.groupby('Product').agg({
 -     'Sales': ['sum', 'mean', 'count']
 - })
 - print("\n产品统计:")
 - print(product_stats)
 - # 使用shape获取每个产品的销售次数
 - product_counts = sales_df_cleaned.groupby('Product').apply(lambda x: x.shape[0])
 - print("\n每个产品的销售次数:")
 - print(product_counts)
 - # 3. 数据可视化准备
 - # 按月份和地区汇总销售额
 - sales_df_cleaned['Month'] = sales_df_cleaned['Date'].dt.month
 - monthly_region_sales = pd.pivot_table(
 -     sales_df_cleaned, 
 -     values='Sales', 
 -     index='Month', 
 -     columns='Region', 
 -     aggfunc='sum'
 - )
 - print("\n月度地区销售额透视表形状:", monthly_region_sales.shape)
 - print("月度地区销售额透视表:")
 - print(monthly_region_sales)
 - # 4. 高级分析
 - # 计算每个产品在每个地区的市场份额
 - region_product_sales = pd.pivot_table(
 -     sales_df_cleaned, 
 -     values='Sales', 
 -     index='Region', 
 -     columns='Product', 
 -     aggfunc='sum'
 - )
 - # 计算每个地区的总销售额
 - region_total = region_product_sales.sum(axis=1)
 - # 计算市场份额
 - market_share = region_product_sales.div(region_total, axis=0) * 100
 - print("\n市场份额表形状:", market_share.shape)
 - print("市场份额(%):")
 - print(market_share)
 - # 5. 数据导出准备
 - # 假设我们只想要销售额前80%的数据
 - # 首先按销售额排序
 - sales_df_sorted = sales_df_cleaned.sort_values('Sales', ascending=False)
 - # 计算前80%的数据应该有多少行
 - top_80_percent_rows = int(sales_df_sorted.shape[0] * 0.8)
 - # 获取前80%的数据
 - top_80_percent_data = sales_df_sorted.head(top_80_percent_rows)
 - print(f"\n前80%高销售额数据形状: {top_80_percent_data.shape}")
 - print(f"前80%高销售额数据占总销售额的比例: {top_80_percent_data['Sales'].sum() / sales_df_cleaned['Sales'].sum() * 100:.2f}%")
 - # 6. 性能优化
 - # 如果数据集很大,我们可以考虑使用更高效的数据类型
 - def optimize_dataframe(df):
 -     # 获取原始内存使用
 -     original_memory = df.memory_usage(deep=True).sum() / 1024**2
 -     
 -     # 优化数值列
 -     for col in df.select_dtypes(include=['int64']).columns:
 -         df[col] = pd.to_numeric(df[col], downcast='integer')
 -     
 -     for col in df.select_dtypes(include=['float64']).columns:
 -         df[col] = pd.to_numeric(df[col], downcast='float')
 -     
 -     # 优化对象列
 -     for col in df.select_dtypes(include=['object']).columns:
 -         if df[col].nunique() / len(df[col]) < 0.5:  # 如果唯一值比例小于50%
 -             df[col] = df[col].astype('category')
 -     
 -     # 获取优化后的内存使用
 -     optimized_memory = df.memory_usage(deep=True).sum() / 1024**2
 -     
 -     print(f"原始内存使用: {original_memory:.2f} MB")
 -     print(f"优化后内存使用: {optimized_memory:.2f} MB")
 -     print(f"内存减少: {(original_memory - optimized_memory) / original_memory * 100:.2f}%")
 -     
 -     return df
 - # 优化数据框
 - print("\n数据框优化:")
 - optimized_sales_df = optimize_dataframe(sales_df_cleaned.copy())
 
  复制代码 
这个案例展示了如何在实际数据分析过程中使用shape属性来: 
 
1. 验证数据加载和清洗的结果 
2. 统计分组数据的数量 
3. 检查透视表的维度 
4. 确定数据子集的大小 
5. 监控内存优化效果 
 
7. 总结 
 
pandas的shape属性虽然简单,但在数据分析中却是一个不可或缺的工具。通过本文的介绍,我们了解了shape属性的基本用法、应用场景以及与其他pandas功能的结合使用。掌握shape属性的使用技巧,可以帮助我们: 
 
1. 快速了解数据集的规模和结构 
2. 验证数据操作的结果是否符合预期 
3. 优化数据处理流程和内存使用 
4. 提高数据分析的效率和准确性 
 
在实际的数据分析工作中,建议将检查数据形状作为一个标准步骤,特别是在数据加载、清洗、转换和合并等关键操作之后。这样可以帮助我们及时发现问题,确保数据分析的准确性和可靠性。 
 
通过不断实践和探索,你会发现shape属性虽然简单,但在提升数据分析效率方面有着不可替代的作用。希望本文的介绍能够帮助你更好地掌握pandas输出形状技巧,提升数据分析效率。
    版权声明
    
        1、转载或引用本网站内容(轻松掌握pandas输出形状技巧提升数据分析效率)须注明原网址及作者(威震华夏关云长),并标明本网站网址(https://www.pixtech.cc/)。 
2、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。 
3、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利。 
        本文地址: https://www.pixtech.cc/thread-40750-1-1.html 
     
 
 |   
 
 
 
 |