pandas中关于数据选择和过滤

pandas中关于数据选择和过滤

1. 基本数据选择和过滤

1.1 按列选择

  • 单列选择:

    df['column_name']  # 返回一个Series
    
  • 多列选择:

    df[['column_name1', 'column_name2']]  # 返回一个DataFrame
    
  • 列切片选择:

    df.loc[:, 'column_name1':'column_name3']  # 选择从 'column_name1' 到 'column_name3' 的所有列
    

1.2 按行选择

  • 单行选择:

    df.iloc[2]  # 选择第3行(基于0的索引)
    
  • 多行选择:

    df.iloc[2:5]  # 选择第3到第5行(不包括第5行)
    df.loc[2:5]   # 使用索引标签选择第2到第5行(包括第5行)
    
  • 条件选择:

    df[df['column_name'] > 10]  # 选择 'column_name' 列值大于10的行
    

2. 复杂条件过滤

2.1 使用布尔运算符

  • 多条件过滤:

    • 使用 & (AND):

      df[(df['column1'] > 10) & (df['column2'] == 'value')]
      
    • 使用 | (OR):

      df[(df['column1'] > 10) | (df['column2'] == 'value')]
      
  • 否定条件过滤:

    • 使用 ~(取反):
      df[~(df['column_name'] > 10)]  # 选择 'column_name' 列值不大于10的行
      

2.2 使用 isin 进行多值过滤

  • 多个值过滤:

    df[df['column_name'].isin(['value1', 'value2', 'value3'])]
    
  • 不在列表中的值:

    df[~df['column_name'].isin(['value1', 'value2'])]
    

2.3 使用 query 方法

  • 类似SQL的过滤:
    df.query('column1 > 10 and column2 == "value"')
    

3. 高级选择和过滤技巧

3.1 使用 between 方法

  • 范围选择:
    df[df['column_name'].between(10, 20)]  # 选择 'column_name' 列值在10到20之间的行
    

3.2 使用字符串方法

  • 字符串匹配:
    • 包含子字符串:

      df[df['column_name'].str.contains('substring', na=False)]
      
    • 以特定字符串开头或结尾:

      df[df['column_name'].str.startswith('prefix', na=False)]
      df[df['column_name'].str.endswith('suffix', na=False)]
      

3.3 使用 applylambda 表达式

  • 基于复杂逻辑的行选择:
    df[df.apply(lambda row: row['column1'] > 10 and row['column2'] == 'value', axis=1)]
    

3.4 使用 transform 方法

  • 按组计算:
    df['normalized_column'] = df.groupby('group_column')['value_column'].transform(lambda x: (x - x.mean()) / x.std())
    

3.5 使用 pivot_table 进行数据透视

  • 数据透视表:
    pivot_df = df.pivot_table(values='value_column', index='index_column', columns='columns_column', aggfunc='mean')
    

4. 多级索引和层次化索引

4.1 多级索引选择

  • 创建多级索引:

    df.set_index(['column1', 'column2'], inplace=True)
    
  • 多级索引过滤:

    • 通过 .loc 选择特定层级的索引:
      df.loc['index1']  # 选择第一级索引为 'index1' 的所有行
      df.loc[('index1', 'index2')]  # 选择第一级索引为 'index1' 且第二级索引为 'index2' 的行
      
  • 按层级选择:

    • 使用 IndexSlice 对象:
      idx = pd.IndexSlice
      df.loc[idx['index1', :], :]  # 选择第一级索引为 'index1' 的所有行
      

5. 数据选择的优化和性能提升

5.1 使用 numpy 函数进行矢量化操作

  • 矢量化计算更高效:
    df['new_column'] = np.where(df['column1'] > 10, 'A', 'B')
    

5.2 使用 evalquery 优化

  • evalquery 进行更高效的计算:
    • eval:

      df.eval('new_column = column1 + column2')
      
    • query:

      df.query('column1 > 10 and column2 < 5')
      

5.3 避免 apply 方法

  • 尽量避免使用 apply 进行行级计算,因为其性能较低:
    • 替代方法如直接使用矢量化运算:
      df['new_column'] = df['column1'] * df['column2']
      

6. 其他高级选择和过滤技巧

6.1 使用 groupby 进行选择

  • 基于分组条件的选择:
    grouped = df.groupby('group_column')
    selected_group = grouped.get_group('group_name')
    

6.2 使用 filter 方法

  • 按条件过滤分组:
    df.groupby('group_column').filter(lambda x: len(x) > 2)  # 过滤出行数大于2的分组
    

6.3 自定义函数和选择

  • 结合自定义函数进行复杂选择:
    def complex_filter(row):
        return row['column1'] > 10 or (row['column2'] < 5 and row['column3'] == 'value')
    
    df[df.apply(complex_filter, axis=1)]
    
  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值