精华内容
下载资源
问答
  • 前言:之前的文章(高维数据中特征筛选方法的思考总结——单变量分析筛选法),对单变量分析筛选变量进行了初步考量,本文将进一步总结变量分析筛选法。由于本文处摘录网上的博客,只是进行了归纳整理,因此...

    前言:之前的文章(高维数据中特征筛选方法的思考总结——单变量分析筛选法)中,对单变量分析筛选变量进行了初步考量,本文将进一步总结多变量分析筛选法。由于本文多处摘录网上的博客,只是进行了归纳整理,因此笔者将本文定性为转载类(转载请注明出处:https://blog.csdn.net/fjsd155/article/details/93754257)。

    多变量分析方法根据建模特点可以分为线性降维和非线性降维。线性降维主要是 LASSO 和 PLS。非线性降维包括:XGBoost(GBDT的高效实现)、Random Forest 等。其实个人感觉CNN应该也是可以进行非线性降维的(但是目前CNN处理“非序列数据”并没有优势,笔者有个预处理的设想,准备尝试一下拓宽CNN的适用范围)。另外SVM这种强大的机器学习方法,似乎只能用来建模而不能筛选特征。

    LASSO和PLS都是线性模型的降维方法,也就是说,这两种方法甚至包括上述单变量降维的方法,最终筛选的变量都是为了建立线性模型而准备的,而不能孵育出非线性模型(如存在交互作用的模型、复杂的SVM模型、决策树类模型以及复杂的神经网络模型)。非线性模型的生物学解释性很差(黑箱模型),一般不推荐使用。但是若强行想构建非线性模型,则仅采用上述线性降维的方法是不够理想的,需要采用非线性降维。

    注意一个问题的存在:我们筛选特征往往基于训练数据(选择超参数或者最终建模常常会根据交叉验证,但是变量的筛选却常常只是基于训练集)。在训练数据中,变量的贡献程度越大,并不意味着这个变量越有价值。可能某些变量在模型中表现很普通,但是始终十分稳定(经得起考验);而有些变量在训练数据中表现很好,但外推性却较弱,表现波动大。因此变量的选择有必要综合训练数据和验证数据(如综合CV或Bootstrapping筛选变量)。最后再由独立测试数据进行检验。

    筛选特征及建模的科学观念:模型的可重复性(多批数据)>大样本建模>模型的准确性。有人提出(貌似是范剑青老师等人提出),“针对一个统计方法,统计准确性、模型可解释性和计算复杂性是衡量其好坏的三个重要指标。”

    (下面部分内容参考自:

    一些变量筛选方法——1、综述

    一些变量筛选方法——2、《An Introduction to Statistical Learning with R》上的数据降维方法

    一些变量筛选方法——3、部分其它变量筛选方法

    刚刚从线性与否的角度对降维方法进行了分类概述。另外,An Introduction to Statistical Learning with R 这本书中将筛选变量的方法分为:子集选择法(Subset Selection)系数压缩法(Shrinkage)映射降维法(Dimension Reduction)

    子集选择法

    子集选择法分为最优子集选择逐步筛选法等,这部分方法依赖于下述模型评判指标:

    • Mallows 提出运用Cp去评估一个以普通最小二乘法(Ordinary Least Square或OLS)为假设的线性回归模型的优良性,从而用于模型选择。
    • 日本学者 Akaike 在1974年基于极大似然方法提出了AIC准则,它建立在熵的概念基础上,可以权衡所估计模型的复杂度和此模型拟合数据的优良性。
    • Schwarz 在Bayes方法的基础上提出BIC准则。与AIC相比,BIC加强了惩罚力度,考虑了样本量,从而在选择变量进入模型上更加谨慎。
    • Seymour Geisser 提出了交叉验证法(Cross validation),利用交叉验证结合最小平方误差的方法,是一种在没有任何前提假定的情况下直接进行参数估计的变量选择方法。

    此外,还可以使用Adjusted R2进行评价来选择特征子集。这些指标的具体含义和使用方法,可参照An Introduction to Statistical Learning with R 或 一些变量筛选方法——2、《An Introduction to Statistical Learning with R》上的数据降维方法

    最优子集法(Best Subset Selection):其思想是将所有的特征组合都进行建模,然后选择最优的模型(最优的判断依据都是前面叙述的几种指标)。特点是能够找到全局最优但是计算量较大。

    逐步筛选法(Stepwise Selection)分为向前逐步回归与向后逐步回归。其主要思想是:每一次迭代都只能沿着上一次迭代的方向继续进行。向前逐步回归是指初始模型只有常数项,然后逐渐添加变量;向后逐步回归是指初始模型包含了所有变量,然后逐渐删除变量。特点是仅关注局部最优(贪心策略)难以保证全局最优(注:向前与向后逐步回归筛选出的变量可能不一样,但其思想完全一样。)

    系数压缩法

    系数压缩法主要指LASSO。岭回归只能实现系数压缩而不能降维,但是可以通过合理的调参,将系数压缩后对系数进行排序,从而实现降维(但既然LASSO已经还不错了,没必要强行使用岭回归降维)。

    LASSO可参考博客:LASSO回归

    映射降维法

    映射降维法主要指的是PLS。另外,PCR(主元回归法)是进行主成分分析(PCA)后,选取前几个主成分进行建模,但实际上建模的效果很一般;PLS是基于PCA的思想,结合回归建模、典型关联分析(CCA)以及拟合残差(带一点Gradient Boost)等各家思想,所孕育出的一种建模分析和降维方法。

    PLS可参考博客:偏最小二乘法 Partial Least Squares

    其他不错的方法

    除了上述三大类方法,树结构的方法以及Boosting类的方法也是比较有效的,如:Random ForestXGBoost(GBDT的高效实现)等。此外,Fan和Li 结合L0与L1范数提出的SCAD (Smoothly Clipped Absolute Deviation);Fan 提出的SIS(Sure Independence Screening)等。

    Random Forest

    随机森林模型本身是用于预测的模型,但在预测过程中,可以对变量重要性进行排序,然后通过这种排序来进行变量筛选。

    变量重要性评判用Gini指数为标准,针对一棵树中的每个节点 k,我们都可以计算一个Gini指数:
          

    其中\hat{p}_k表示样本在节点 k 属于任意一类的概率估计值。

    一个节点的重要性由节点分裂前后Gini指数的变化量来确定:
          

    G_{k1} 和G_{k2} 分别表示G_{k} 产生的子节点。针对森林中的每棵树,都用上述的标准来递归产生,最终随机抽取样本和变量,产生森林,假设森林共产生 T 棵树。

    森林中,如果变量X_i 在第 t 棵树中出现 M 次,则变量X_i 在第 t 棵树的重要性为:
          

    X_i 在整个森林中的变量重要性为:
          
    最终我们根据变量重要性来选择变量,选择的个数可以用SIS中的方法,选取n−1 或n/logn 个。

    XGBoost

    GBDT的建模过程是,一步步拟合残差,那么在一步步的拟合的过程中,也便是变量选择的过程(从一定程度上实现了变量的筛选)(这种逐步拟合残差的思想的方法还有PLS)。XGBoost是GBDT的高效实现方法。

    GBDT的介绍可参考:GBDT

    XGBoost 的介绍可参考:XGBoost

    SCAD

    与岭回归相比,SCAD降低了模型的预测方差,与此同时与LASSO相比,SCAD又缩小了参数估计的偏差,因而受到了广泛的关注。L0方法只会进行变量筛选,不会进行压缩,L1(LASSO)既会进行变量筛选,也会对系数继续一定的调整。而SCAD可以从图中很明显的其结合了两种方法,对系数较大的变量不进行惩罚,对系数较少的进行压缩或者删去,因此这种方法既可以筛选变量,也有着Oracle的性质。SCAD虽然有相应的迭代算法,但是由于其复杂度高,所以计算速度相对较慢

    SCAD的产生,有点借鉴Elastic Net。

    SIS

    当遇到超高维数据,即维数P无穷大时,上述的算法会出现问题。针对这类超高维问题,Fan等人提出了SIS的方法。

    针对线性回归模型(2),按照SIS的思想,首先Y为中心化向量,计算Y与每一个自变量x_i 的相关系数,记为 \omega=X^TY

    其中\omega=(\omega_1,\omega_2,...,\omega_p)^T,若\omega_i越大,说明x_i与Y 相关性越强。所以,可以根据 |\omega_i| 的大小来进行变量选择。对任意的\gamma \in (0,1),对 |\omega_i| 进行从大到小排序,然后取其一个子集

          

    其中,n是样本数,[\gamma n] 是\gamma n 的整数部分,进而保证了[\gamma n]<n,与之对应的自变量则入选模型。如果觉得选择 [\gamma n] 不便于确定,可以选择 n-1 或n/logn。

    而关于相关系数,可以选用自己认为合适的。本文后面的模拟选用传统的Pearson相关系数,以及近几年比较火的可用于检验独立的无参数假设的距离相关性(Distance Covariance)(见:一些变量筛选方法——3、部分其它变量筛选方法)。

    严格来说,SIS 属于单变量分析方法。

    另外,SIS有一些衍生版本,如DC-SIS及Qa-SIS等,其中Qa-SIS好像是可以处理非线性问题的(据说还是“异方差”)。

    PDAS

    原始对偶激活集算法(Primal Dual Active Set,PDAS)是一个非常新的方法,但做的事情是最优子集选择的事情。其主要思想是引入激活集,对所有的 β 进行批量迭代更新。这个方法的优势在于,可以处理超高维数据(上万维),而最优子集选择一旦超过了50维,基本就完全没办法进行运算。后面我们也将采用PDAS来进行模拟。

    PDAS的介绍可参考:一些变量筛选方法——3、部分其它变量筛选方法

     

    另外,有人总结了7种降维方法(七种降维方法):

    1. 缺失值比率 (Missing Values Ratio) ;
    2. 低方差滤波 (Low Variance Filter) ;
    3. 高相关滤波 (High Correlation Filter);
    4. 随机森林/组合树 (Random Forests);
    5. 主成分分析 (PCA);
    6. 反向特征消除 (Backward Feature Elimination);
    7. 前向特征构造 (Forward Feature Construction)。

    本文的总结其实基本上都包含了这些内容。

    也有人总结了12种降维方法(在以上7种方法基础上加了5种)(来源:Analytics Vidhya:The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes),也可参考:12种降维方法终极指南(含Python代码)):

    1. 缺失值比率:如果数据集的缺失值太多,我们可以用这种方法减少变量数。
    2. 低方差滤波器:这个方法可以从数据集中识别和删除常量变量,方差小的变量对目标变量影响不大,所以可以放心删去。
    3. 高相关滤波器:具有高相关性的一对变量会增加数据集中的多重共线性,所以用这种方法删去其中一个是有必要的。
    4. 随机森林:这是最常用的降维方法之一,它会明确算出数据集中每个特征的重要性。
    5. 向后特征消除:耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。
    6. 前向特征选择:思路类似于“向后特征消除”。
    7. 因子分析:这种方法适合数据集中存在高度相关的变量集的情况。
    8. 主成分分析(PCA):这是处理线性数据最广泛使用的技术之一。
    9. 独立分量分析(ICA):我们可以用ICA将数据转换为独立的分量,使用更少的分量来描述数据。
    10. 基于投影的方法:ISOMAP适合非线性数据处理。
    11. t分布式随机邻域嵌入(t-SNE):也适合非线性数据处理,相较上一种方法,这种方法的可视化更直接。
    12. UMAP:用于高维数据,与t-SNE相比,这种方法速度更快。

          

    之后有空可以再总结下 t-SNE(无监督降维方法,主要用于高维度数据的降维可视化)。

    另外,scikit-learn机器学习工具包的官网也有一些特征筛选的方法介绍,有博客基于此进行了介绍(原文:http://dataunion.org/14072.html,但是好像原文访问不了了,可以看看转载的博客,比如:几种常用的特征选择方法,或 干货:结合Scikit-learn介绍几种常用的特征选择方法 )。

    除了这些,还有一些方法也值得一试,如:随机投影(Random Projections),非负矩阵分解(N0n-negative Matrix Factorization),自动编码(Auto-encoders),卡方检测与信息增益(Chi-square and information gain), 多维标定(Multidimensional Scaling), 相关性分析(Coorespondence Analysis),聚类(Clustering)以及贝叶斯模型(Bayesian Models)。

    基于聚类的方法,可以参考:

    特征筛选(变量聚类proc varclus)

    聚类特征变量选取、聚类算法与效果评价简述

    特征选择(二)-聚类变换

    还有互信息法模拟退火法以及一些组合策略等,之后再了解一下。参考:

    特征选择(2):特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数

    模拟退火筛选变量

    特征选择的策略--数据相关性(皮尔逊系数)与gini或者信息熵的的结合

    特征选择之基于相关性的特征选择(CFS)

    自编码器也是不错的无监督降维方法,是一种神经网络,之后可以研究下。

     

    各种方法的对比评测及代码示例

    这部分内容可以参考:

    一些变量筛选方法——4、模拟实验

    一些变量筛选方法——5、真实数据与总结

    一些变量筛选方法——6、代码

     

    参考资料

    一些变量筛选方法——1、综述

    一些变量筛选方法——2、《An Introduction to Statistical Learning with R》上的数据降维方法

    一些变量筛选方法——3、部分其它变量筛选方法

    一些变量筛选方法——4、模拟实验

    一些变量筛选方法——5、真实数据与总结

    一些变量筛选方法——6、代码

    LASSO回归

    偏最小二乘法 Partial Least Squares

    GBDT

    XGBoost

    七种降维方法

    The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes)

    Comprehensive Guide on t-SNE algorithm with implementation in R & Python

    12种降维方法终极指南(含Python代码)

    特征筛选(变量聚类proc varclus)

    聚类特征变量选取、聚类算法与效果评价简述 

    特征选择(一)-维数问题与类内距离

    特征选择(二)-聚类变换

    展开全文
  • 今天我们来讲一下Excel的筛选功能,筛选功能可以一大堆的数据中,按照某个条件筛选出来我们想要的数据;比如一整个年级的考试成绩,筛选出来某个班的。 1如何开启筛选 选中区域内的任一单元格;使用快捷键Ctrl ...

    今天我们来讲一下Excel的筛选功能,筛选功能可以在一大堆的数据中,按照某个条件筛选出来我们想要的数据;比如一整个年级的考试成绩,筛选出来某个班的。

    1如何开启筛选

    选中区域内的任一单元格;使用快捷键Ctrl Shift L,或者使用菜单选项中的“排序和筛选”--“筛选”;可以开启筛选/关闭筛选。

    开启筛选之后,我们看到第一行每一列都有个下拉的箭头。点击此箭头,可以看到本列的筛选条件。把条件前面的勾取消,则此条件对应的数据就不再显示。

    在下拉的菜单中选择“从XX中清除筛选”,就可以撤销单个筛选条件。

    也可以通过“排序和筛选”--“清除”来清除所有筛选。

    2筛选注意事项

    1、筛选分为3种模式:文本筛选、数字筛选、按颜色筛选;

    文本筛选:我们可以根据“等于”“不等于”“开头是”“结尾是”“包含”“不包含”“自定义筛选”多种形式来进行筛选。

    比如:我们可以使用小组“包含A”来筛选出A组信息;

    数字筛选:当一列只有数字时,我们可以根据“等于”“不等于”“大于”“大于或等于”“小于”“小于或等于”“介于”“前10项”等等形式来进行筛选。

    比如:使用绩效“大于1000”筛选出绩效大于1000的员工信息;

    颜色筛选:可以根据单元格的背景颜色,或者文本颜色来筛选;前提是单元格或者文本设置有颜色,才能使用颜色筛选。

    2、可以根据多个条件筛选:

    上例我们已经演示:先筛选出A组的绩效,还可以再筛选出A组绩效大于1000的员工。

    3额外小知识

    可以通过下拉菜单中的搜索框直接搜索想要的数据。

    还可以继续筛选,只要勾选“将当前所选内容添加到筛选器”,就可以保留之前筛选出来的数据,从而继续添加新的数据。如下图:

    这在我们做考勤时十分有用,利用组员的姓名搜索,再搜索其他的组员添加到筛选器;

    以上就是我们经常用到的筛选功能了,其实很多我们想不要的功能都隐藏在一些菜单里面,只要我们平时多摸索试验,就能发现Excel给你一次次惊喜哟。http://pdftoword.55.la/img2icon/

    展开全文
  • JS前端数据多条件筛选

    千次阅读 2019-09-26 15:57:08
    有时候也会需要前端进行数据筛选,增强交互体验。当数据可用的筛选条件较时,把逻辑写死会给后期维护带来大麻烦。下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置。 仿照京东的...
    有时候也会需要在前端进行数据筛选,增强交互体验。当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦。下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置。
    
    仿照京东的筛选条件,这里就取价格区间和品牌作为测试。
    
    
    
    代码
    代码中主要使用js的过滤器Array.prototype.filter,该方法会对数组元素进行遍历检查,返回一个符合检查条件的新数组,不会改变原数组。
    
    // filter()
    var foo = [0,1,2,3,4,5,6,7,8,9];
    
    var foo1 = foo.filter(
        function(item) {
            return item >= 5
        }
    );
    
    console.log(foo1);  // [5, 6, 7, 8, 9]
    
    有了这个方法,筛选数据方便了很多,下面先定义一个商品类。
    
    // 定义商品类
    function Product(name, brand, price) {
        this.name = name;  // 名称
        this.brand = brand;   // 品牌
        this.price = price;  // 价格
    }
    
    创建一个过滤器对象,把所有过滤数据的方法放在里面。为了能自动适配不同的筛选条件,将筛选条件分为两个大类,一个是区间类型rangesFilter ,如:品牌、内存等;一个是选择类型choosesFilter,如:价格、屏幕尺寸等。
    
    不同大类同时筛选时,进行的是与逻辑,每个大类在上一个大类筛选结果上进行筛选。比如我要筛选2000-5000块的华为手机,先调用rangesFilter筛选products并返回结果result1,然后用choosesFilter筛选result1并返回结果resulte2。
    
    当然,如果还有其它大类,不一定是与逻辑,再另行处理。
    
    // 商品筛选器
    const ProductFilters = {
        /**
         * 区间类型筛选
         * @param {array<Product>} products
         * @param {array<{type: String, low: number, high: number}>} ranges
         */
        rangesFilter: function (products, ranges) { } 
    
        /**
         * 选择类型筛选
         * @param {array<Product>} products
         * @param {array<{type: String, value: String}>} chooses
         */
        choosesFilter: function (products, chooses) { }
    }
    
    区间类型的筛选,代码如下。
    
    // 区间类型条件结构
    ranges: [
            {
                type: 'price',  // 筛选类型/字段
                low: 3000,  // 最小值
                high: 6000  // 最大值
            }
        ]
    
    /**
         * @param {array<Product>} products
         * @param {array<{type: String, low: number, high: number}>} ranges
         */
        rangesFilter: function (products, ranges) {
            if (ranges.length === 0) {
                return products;
            } else {
                /**
                 * 循环多个区间条件,
                 * 每种区间类型应该只有一个,
                 * 比如价格区间不会有1000-2000和4000-6000同时需要的情况
                 */
                for (let range of ranges) {
                    // 多个不同类型区间是与逻辑,可以直接赋值给自身
                    products = products.filter(function (item) {
                        return item[range.type] >= range.low && item[range.type] <= range.high;
                    });
                }
                return products;
            }
        }
    
    选择类型筛选:
    
    // 选择类型条件结构
    chooses: [
            {
                type: 'brand',
                value: '华为'
            },
            {
                type: 'brand',
                value: '苹果'
            }
        ]
    
    /**
         * @param {array<Product>} products
         * @param {array<{type: String, value: String}>} chooses
         */
        choosesFilter: function (products, chooses) {
            let tmpProducts = [];
            if (chooses.length === 0) {
                tmpProducts = products;
            } else {
                /**
                 * 选择类型条件是或逻辑,使用数组连接concat
                 */
                for (let choice of chooses) {
                    tmpProducts = tmpProducts.concat(products.filter(function (item) {
                        return item[choice.type].indexOf(choice.value) !== -1;
                    }));
                }
            }
            return tmpProducts;
        }
    
    定义一个执行函数doFilter()。
    
    function doFilter(products, conditions) {
        // 根据条件循环调用筛选器里的方法
        for (key in conditions) {
            // 判断是否有需要的过滤方法
            if (ProductFilters.hasOwnProperty(key + 'Filter') && typeof ProductFilters[key + 'Filter'] === 'function') {
                products = ProductFilters[key + 'Filter'](products, Conditions[key]);
            }
        }
        return products;
    }
    
    // 将两种大类的筛选条件放在同一个对象里
    let Conditions = {
        ranges: [
            {
                type: 'price',
                low: 3000,
                high: 6000
            }
        ],
        chooses: [
            {
                type: 'brand',
                value: '华为'
            }
        ]
    }
    
    测试
    创建10个商品数据,以及筛选条件
    
    // 商品数组
    const products = [
        new Product('华为荣耀9', '华为', 2299),
        new Product('华为P10', '华为', 3488),
        new Product('小米MIX2', '小米', 3599),
        new Product('小米6', '小米', 2499),
        new Product('小米Note3', '小米', 2499),
        new Product('iPhone7 32G', '苹果', 4588),
        new Product('iPhone7 Plus 128G', '苹果', 6388),
        new Product('iPhone8', '苹果', 5888),
        new Product('三星Galaxy S8', '三星', 5688),
        new Product('三星Galaxy S7 edge', '三星', 3399),
    ];
    // 筛选条件
    let Conditions = {
        ranges: [
            {
                type: 'price',
                low: 3000,
                high: 6000
            }
        ],
        chooses: [
            {
                type: 'brand',
                value: '华为'
            },
            {
                type: 'brand',
                value: '苹果'
            }
        ]
    }
    
    调用函数
    
    let result = doFilter(products, Conditions);
    console.log(result);
    1
    2
    输出
    
    
    
    代码的扩展性和可维护性都很好,只要保证筛选条件中的type字段在商品数据中一致都可以筛选,比如将筛选条件改为
    
    let Conditions = {
        ranges: [
            {
                type: 'price',
                low: 3000,
                high: 6000
            }
        ],
        chooses: [
            {
                type: 'name',
                value: 'iPhone'
            }
        ]
    }
    ————————————————
    版权声明:本文为CSDN博主「Johnson·Lee」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/l598465252/article/details/78123131/

     

    展开全文
  • 这些数据分布在很多的Excel表格。![图片](https://img-ask.csdn.net/upload/201604/30/1462018292_154317.jpg)
  • pandas按条件筛选数据

    万次阅读 2019-04-08 19:39:58
    pandas对DataFrame筛选数据的方法有很多的,以后会后续进行补充,这里只整理遇到错误的情况。 1.使用布尔型DataFrame对数据进行筛选 使用一个条件对数据进行筛选,代码类似如下: num_red=flags[flags['red']=...

    pandas中对DataFrame筛选数据的方法有很多的,以后会后续进行补充,这里只整理遇到错误的情况。

    1.使用布尔型DataFrame对数据进行筛选

    使用一个条件对数据进行筛选,代码类似如下:

    num_red=flags[flags['red']==1]

    使用多个条件对数据进行筛选,代码类似如下:

    stripes_or_bars=flags[(flags['stripes']>=1) | (flags['bars']>=1)]

    常见的错误代码如下:

    代码一:

    stripes_or_bars=flags[flags['stripes']>=1 or flags['bars']>=1]

    代码二:

    stripes_or_bars=flags[flags['stripes']>=1 | flags['bars']>=1].

    代码三:

    stripes_or_bars=flags[(flags['stripes']>=1) or (flags['bars']>=1)]

    以上这三种代码的错误提示都是:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 中括号里面的逻辑式如何解析的暂时不清楚。貌似不能使用and、or及not。

    除了使用组合的逻辑表达式之外,使用返回类型为布尔型值的函数也可以达到筛选数据的效果。示例如下:

    import pandas as pd
    import numpy as np
    df=pd.DataFrame(np.array(range(10)).reshape((5,-1)))
    df.columns=['0','1']
    df=df[df['1'].isin([3,5,9])]

     其df的结果如下:

    2.iloc()方法、ix()方法和iloc()方法的区别

    首先dataframe一般有两种类型的索引:第一种是位置索引,即dataframe自带的从0开始的索引,这种索引叫位置索引。另一种即标签索引,这种索引是你在创建datafram时通过index关键字,或者通过其他index相关方法重新给dataframe设置的索引。这两种索引是同时存在的。一般设置了标签索引之后,就不在显示位置索引,但不意味着位置索引就不存在了。

    假设有如下几行数据(截图部分只是数据的一部分),很明显,以下显示的索引为标签索引。同时574(标签索引)行对应的位置索引则为0,1593行对应的位置索引为1, 以此类推。

    先来看loc(),其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.htm,函数名下方有一行解释,Access a group of rows and columns by label(s) or a boolean array.. loc[] is primarily label based, but may also be used with a boolean array. 

    代码一:

    first_listing = normalized_listings.loc[[0,4]]
    

    结果如下,可以看出其输出的是dataframe中标签索引为0和4的两行数据。注意,如果标签索引的类型为字符串,则在loc中也要用字符串的形式。

    再来看iloc(),其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html,函数名下方的解释为 Purely integer-location based indexing for selection by position. .iloc[] is primarily integer position based ( from 0 to length-1 of the axis), but may also be used with a boolean array.

    代码二:

    first_listing = normalized_listings.iloc[[0,4]]
    

    结果如下,可以看出其输出的dataframe中第0行和第4行的数据,即按方法是按照位置索引取得数。注意使用位置索引的时候只能用整数(integer position,bool类型除外)

    另外,还可以向loc和iloc中传入bool序列,这样就可以将前面介绍的boo表达式用到loc和iloc中。下面来看看怎么使用bool序列?

    import pandas as pd
    data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
                     index=['a','b','c','d','e'])
    print(data)
    #iloc[]示例,iloc似乎不能直接使用逻辑表达式的结果,我这里将其转置成list之后就可以用了,原因暂且不明
    data_1=data.iloc[list(data['col1']>5)]
    print(data_1)
    #loc[]示例,loc中可以直接使用逻辑表达式
    data_2=data.loc[data['col1']>5]
    print(data_2)

    在iloc[]中,如果直接使用loc中的逻辑表达式而不进行list()转化的话,会提示ValueError: iLocation based boolean indexing cannot use an indexable as a mask错误。

    如果查看上述两段代码中得到的first_listing。我们会发现两处first_listing的类型均为datafrarm。loc和iloc除了能对行进行筛选,还可以筛选列。如果在loc和iloc中设定了对列的筛选,则筛选之后得到的数据可能是datafrme类型,也有可能是Series类型。下面直接以代码运行结果进行说明。

    import pandas as pd
    data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
                     index=['a','b','c','d','e'])
    print(data)
    #iloc[]示例 ,在使用iloc的时候,[]里面无论是筛选行还是筛选列,都只能使用数字形式的行号或列号。
    #这里如果使用‘col2’,这里会报错
    data_1=data.iloc[[0,4],[1]]#当需要筛选出多列或者希望返回的结果为DataFrame时,可以将列号用[]括起来。
    print(data_1)
    print(type(data_1))
    data_2=data.iloc[[0,4],1]#当只需要筛选出其中的一列时可以只写一个列号,不加中括号,这种方法得到的是一个Series
    print(data_2)
    print(type(data_2))
    #loc[]示例
    data_3=data.loc[['a','e'],['col2']]
    print(data_3)
    print(type(data_3))
    data_4=data.loc[['a','e'],'col2']
    print(data_4)
    print(type(data_4))

    具体的代码执行结果如下:

    最后看ix()方法,其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ix.html,其解释为 A primarily label-location based indexer, with integer position fallback.

    代码三:

    first_listing = normalized_listings.ix[[0,4]]
    

    结果如下似乎与loc()方法的结果是相同的,但是从其给出的解释来看,其好像是前两个方法的集合。

    展开全文
  • R语言数据筛选索引

    万次阅读 2016-12-31 23:54:05
    R中数据筛选方法综述 利用整数下标形式索引 x=c(1:10) x ## [1] 1 2 3 4 5 6 7 8 9 10 x[4] ## [1] 4 x[1:3] ## [1] 1 2 3 x[-3] ## [1] 1 2 4 5 6 7 8 9 10 x[-c(1:3)] ## [1] 
  • 基因组学、转录组学、蛋白组学及代谢组学等生信问题(高通量数据,面临的第一步往往就是降维(或者说筛选特征)。降维方法分为两大类:单变量分析降维法、变量分析降维法。单变量降维常常使用FC值或者P值,...
  • 工作和学习,我们经常要和Excl打交道,对数据进行一些简单和复杂的处理,可以说Office三件套是业界公认的“神器”级别的产品,本文,我们将探讨Excl对数据进行筛选,剔除获取提取满足条件的的数据,如:1.删除...
  • 一个不知名的教程网站上学习,进行筛选时只能选中一个条件进行筛选很不方便想问一下有没有什么软件可以帮助就行筛选,或代码也行。跪求!
  • DataView 数据筛选

    千次阅读 热门讨论 2014-02-13 11:01:41
    数据筛选,种类无非两种,筛选有用去除重复或无用。 以前做项目遇到一个问题,就是获取DataTable某一列的值,因为从数据库检索数据时,按照2个字段进行分组,而要获得的那一列刚好分组这两列,所以该列...
  • 数据挖掘和机器学习这事,其实大部分时间不是做算法,而是数据,毕竟算法往往是现成的,改变的余地小。  数据预处理的目的就是把数据组织成一个标准的形式。 1.归一化  归一化通常采用两种方法。  a....
  • linuxgrep命令数据过滤和筛选

    千次阅读 2020-07-05 23:08:25
    Linux世界有句古老的说法“一切皆文件”,而且很多配置文件是纯文本文件,工作,我们时常需要对大量的服务器进行配置的修改,如果以手动方式海量的数据中进行查找匹配并最终完成修改,则其效率极低。...
  • pandas个列的组合条件筛选数据

    千次阅读 2020-03-18 15:11:09
    A文件: 比如,我想筛选出“设计井别”、“投产井别”、“目前井别”三列数据都为11的数据,结果如下: ...#input.csv是那个大文件,有很多很多行 df1 = pd.read_csv(u'input.csv', encoding='gbk') ...
  • ALV有时会显示很多很多数据,业务人员完成对数据筛选之后,可能会对数据进行过账,分摊或者其他的操作,这时候使用全选按钮会导致所以数据都被全选,包括筛选前的数据,所以为了解决这个问题: DATAlr_...
  • 目录 1、以搜索的形式进行筛选 ...7、带标签筛选 结语 1、以搜索的形式进行筛选 输入框可以输入用户关心的内容,下面可以做到实时筛选,也可以触发点击。但是必须支持模糊查询,否则用户必须记住所...
  • 有一个需求是前端部分完成筛选功能,一次拿到所有数据,然后根据条件筛选。通常情况下筛选是后台给接口,在数据量不大的情况下,也有人可能会遇到前端筛选这样的情况。 一般情况下的单条件筛选,数组的filter方法...
  • Excel使用VBA来筛选数据

    万次阅读 2004-11-27 15:34:00
    问题大概是这样的,一个大的Excel文件,其中有些行是重复的,也就是说,有2行是完全一样的,而有些行是不重复的,现在的问题是要找出所有不重复或者重复的行,你没有听明白。你大概考虑了一下,用“VLOOKUP”查找...
  • vue 通过日期筛选数据

    千次阅读 2019-08-15 16:39:02
    此片博客介绍的方法是通过请求后台数据给的状态,然后把自己选择的时间传过去实现筛选的,根据业务逻辑来参考吧! 下篇我们会说下通过vue过滤器来实现的方法! html部分· <div class="ag_listmain clearfix">...
  • 本文主要介绍通过Python提取csv文件中数据,并对数据进行处理。 编译器:Anaconda3 语言:Python3 提示:以下是本篇文章正文内容,本文仅为作者作为学习笔记使用,大佬勿喷 一、pandas与numpy? pandas是一个强大的...
  • 使用Pandas对数据进行筛选和排序

    万次阅读 多人点赞 2016-12-06 16:06:37
    使用Pandas对数据进行筛选和排序
  • 先根据筛选条件获取满足条件记录的id,并且对idsql排序(避免大量数据内存排序,慢、耗性能),取到分页对应的id;再根据id查询对应的记录,此时如果id对应的记录中很离散,那么会再次全表遍历; 问题...
  • echarts-x数据筛选

    千次阅读 2018-02-10 13:37:55
    echarts-x里的数据筛选有一个大的bug一开始我的数据展示如图所示:数据筛选:将图上黄色的点隐藏掉$.ajax({ url: './data/placemark.json', success: function (data) { var len = data.length; for(var i = 0;i &...
  • 某公司旗下有很多便利店,但近期却发现个别门店存在全职帮兼职打卡的情况,为此总部领导决定对所有门店的打卡时间数据进行分析,将每一个门店,全职人员和兼职人员上班卡、下班卡其中之一相差1分钟以内的数据找出来...
  • 【转载】使用Pandas对数据进行筛选和排序

    万次阅读 多人点赞 2019-10-01 04:54:18
    使用Pandas对数据进行筛选和排序 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas对数据进行筛选和排序 ...对列数据进行排序 ...单列数据筛选并排序 ...数据筛选并排序 按筛选条件求和(sumi...
  • excel筛选后怎么粘贴数据

    万次阅读 2019-06-10 21:53:00
    【问题】excel表格在筛选状态下粘贴数据,会粘贴到隐藏的部分,也就是和我们所“见到”的不一样,一部分复制的数据被隐藏...所以粘贴一列数据筛选状态的表格,会导致数据粘贴到隐藏的单元格,不能做到“所见即所...
  • 数据分析-Excel导入及筛选数据

    千次阅读 2019-07-09 22:48:44
    通常导入外部网站的数据时,可以先将数据下载到本地,然后用excel打开该文件。下面介绍一种新的方法,直接将外部数导入到excel文件。假如我们要导入如下网页数据:...
  • 基于特征化工程进行用户特征化,结合相关的机器学习算法对业务进行挖掘建模,广告的精准投放、预测、风控等领域应用的非常广泛。无论是有监督的学习分类算法,还是无监督的聚类也罢,都需要建立特征向量,对特征...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 206,111
精华内容 82,444
关键字:

如何在很多数据中筛选