python 数据清洗之数据合并、转换、过滤、排序
<p>前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作,</p> <p>数据清洗一直是数据分析中极为重要的一个环节。</p> <h3>数据合并</h3> <p>在pandas中可以通过merge对数据进行合并操作。</p> <pre> <code class="language-python">importnumpyas np importpandasas pd data1 = pd.DataFrame({'level':['a','b','c','d'], 'numeber':[1,3,5,7]}) data2=pd.DataFrame({'level':['a','b','c','e'], 'numeber':[2,3,6,10]}) print(data1) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/cc92d296925d4be340d3f09a650eada2.png"></p> <pre> <code class="language-python">print(data2) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/7278aa3135aef0e9199ca7f01cb0a896.png"></p> <pre> <code class="language-python">print(pd.merge(data1,data2)) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/9c1e1600ddf03f67d00e855cc88e05f8.png"></p> <p>可以看到data1和data2中用于相同标签的字段显示,而其他字段则被舍弃,这相当于SQL中做inner join连接操作。</p> <p>此外还有outer,ringt,left等连接方式,用关键词how的进行表示。</p> <pre> <code class="language-python">data3 = pd.DataFrame({'level1':['a','b','c','d'], 'numeber1':[1,3,5,7]}) data4=pd.DataFrame({'level2':['a','b','c','e'], 'numeber2':[2,3,6,10]}) print(pd.merge(data3,data4,left_on='level1',right_on='level2')) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/4c3b4cf0792774690028136f38c3d947.png"></p> <p>两个数据框中如果列名不同的情况下,我们可以通过指定letf_on 和right_on两个参数把数据连接在一起</p> <pre> <code class="language-python">print(pd.merge(data3,data4,left_on='level1',right_on='level2',how='left')) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/4b1685c38ebfe204336a2b92e5909a02.png"></p> <p>其他详细参数说明</p> <p><img src="https://simg.open-open.com/show/d47504831bddcd1513187d5c467f03aa.png"></p> <h3>重叠数据合并</h3> <p>有时候我们会遇到重叠数据需要进行合并处理,此时可以用comebine_first函数。</p> <pre> <code class="language-python"> data3 = pd.DataFrame({'level':['a','b','c','d'], 'numeber1':[1,3,5,np.nan]}) data4=pd.DataFrame({'level':['a','b','c','e'], 'numeber2':[2,np.nan,6,10]}) print(data3.combine_first(data4)) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/0ed8a6bc28737016d272ddceba20e472.png"></p> <p>可以看到相同标签下的内容优先显示data3的内容,如果一个数据框中的某一个数据是缺失的,此时另外一个数据框中的元素就会补上</p> <p>这里的用法类似于np.where(isnull(a),b,a)</p> <h3>数据重塑和轴向旋转</h3> <p>这个内容我们在上一篇pandas文章有提到过。数据重塑主要使用reshape函数,旋转主要使用unstack和stack两个函数。</p> <pre> <code class="language-python">data=pd.DataFrame(np.arange(12).reshape(3,4), columns=['a','b','c','d'], index=['wang','li','zhang']) print(data) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/69019dba4a8948efd2660fd5f9d6a62c.png"></p> <pre> <code class="language-python">print(data.unstack()) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/a444f9fbc9cc94b5c35282b1113c1d36.png"></p> <h3>数据转换</h3> <p>删除重复行数据</p> <pre> <code class="language-python">data=pd.DataFrame({'a':[1,3,3,4], 'b':[1,3,3,5]}) print(data) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/f604372201d11a6ca082379c192c1d51.png"></p> <pre> <code class="language-python">print(data.duplicated()) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/06e286546012b4cfa23e5301dc85ad9a.png"></p> <p>可以看出第三行是重复第二行的数据所以,显示结果为True</p> <p>另外用drop_duplicates方法可以去除重复行</p> <pre> <code class="language-python">print(data.drop_duplicates()) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/1cecb01cd5413c2b769ac9a53db09c1c.png"></p> <h3>替换值</h3> <p>除了使用我们上一篇文章中提到的fillna的方法外,还可以用replace方法,而且更简单快捷</p> <pre> <code class="language-python">data=pd.DataFrame({'a':[1,3,3,4], 'b':[1,3,3,5]}) print(data.replace(1,2)) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/2408bf1dc4cf2a62eaf0421096db2b45.png"></p> <p>多个数据一起换</p> <pre> <code class="language-python">print(data.replace([1,4],np.nan)) </code></pre> <p><img src="https://simg.open-open.com/show/a1e8e8c88bf126ae34422bc6fae7cb3e.png"></p> <h3>数据分段</h3> <pre> <code class="language-python">data=[11,15,18,20,25,26,27,24] bins=[15,20,25] print(data) print(pd.cut(data,bins)) </code></pre> <p>结果为:</p> <p>[11, 15, 18, 20, 25, 26, 27, 24][NaN, NaN, (15, 20], (15, 20], (20, 25], NaN, NaN, (20, 25]]</p> <p>Categories (2, object): [(15, 20] < (20, 25]]</p> <p>可以看出分段后的结果,不在分段内的数据显示为na值,其他则显示数据所在的分段。</p> <pre> <code class="language-python">print(pd.cut(data,bins).labels) </code></pre> <p>结果为:</p> <p>[-1 -1 0 0 1 -1 -1 1]</p> <p>显示所在分段排序标签</p> <pre> <code class="language-python">print(pd.cut(data,bins).levels) </code></pre> <p>结果为:</p> <p>Index([‘(15, 20]’, ‘(20, 25]’], dtype=’object’)</p> <p>显示所以分段标签</p> <pre> <code class="language-python">print(value_counts(pd.cut(data,bins))) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/2408bf1dc4cf2a62eaf0421096db2b45.png"></p> <p>显示每个分段值得个数</p> <p>此外还有一个qcut的函数可以对数据进行4分位切割,用法和cut类似。</p> <h3>排列和采样</h3> <p>我们知道排序的方法有好几个,比如sort,order,rank等函数都能对数据进行排序</p> <p>现在要说的这个是对数据进行随机排序(permutation)</p> <pre> <code class="language-python">data=np.random.permutation(5) print(data) </code></pre> <p>结果为:</p> <p>[1 0 4 2 3]</p> <p>这里的peemutation函数对0-4的数据进行随机排序的结果。</p> <p>也可以对数据进行采样</p> <pre> <code class="language-python">df=pd.DataFrame(np.arange(12).reshape(4,3)) samp=np.random.permutation(3) print(df) </code></pre> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/b9d5e9c691a7429cc5a2e04f765fde82.png"></p> <p>print(samp)</p> <p>结果为:</p> <p>[1 0 2]</p> <p>print(df.take(samp))</p> <p>结果为:</p> <p><img src="https://simg.open-open.com/show/e7e8d16b5101175a2bd51f932206db09.png"></p> <p>这里使用take的结果是,按照samp的顺序从df中提取样本。</p> <p> </p> <p>来自:http://python.jobbole.com/87346/</p> <p> </p>
本文由用户 CarBarkly 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!