python 数据清洗之数据合并、转换、过滤、排序

CarBarkly 8年前
   <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>