暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python几行代码分分钟完成拆分列到多行,合并多行到列

龙小马的数字化之路 2021-08-03
2684
上两篇文章我们介绍了用Excel query来拆分单列到多行,然后再合并多行到单列上。

具体可见↓

Excel query拆分列十倍效率提升的骚操作

Excel Query 一个函数分分钟搞定合并多行为一行

第零部:环境配置介绍


首先说下python环境与所用工具
python用的是3.7.8版本

pandas用的是1.1.4版本

代码工具用的是VS Code,然后安装了jupyter notebook插件(直接用jupyter notebook也很ok)



第一部:拆分单列到多行


首先我们加载我们需要处理的数据
    import pandas as pd
    data_path = r'C:\Users\11631\Desktop\data.xlsx'
    data = pd.read_excel(data_path,names=['产品编码','颜色编码'])
    print(data)
    复制

    然后我们需要做的工作跟Excel query的处理方式一致,先对颜色编码进行列表构建,然后去拆分这个列表
      data['颜色编码'] = data['颜色编码'].str.split(',') 
      # split 函数可以对用分隔符分割的文本进行拆分为列表。跟Excel Query 的Text.Split()函数一个作用
      print(data)
      复制

      上面截图我们可以看到,原来逗号分割的文本变成了一个列表。

      为了确保拆分后的数据我们仍然可以找到源数据的对应关系,我们做一个index索引列
        data.reset_index(inplace=True)
        # reset_index 重置索引列,inplace表示重置后的DataFrame替换原来的
        复制


        拆分颜色编码的列表,让他分散到多个行上面,在pandas里,我们只需要一个函数即可。
          a = data.explode('颜色编码',ignore_index=True)
          print(a)
          复制


          explode

          在pandas的参考文档里,修整、透视表格部分最后一小节里,讲的就是通过explode函数来拆分列表类型的列到行上
          https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html#exploding-a-list-like-column
          (原文可以借助谷歌的网页翻译和有道词典进行查看


          DataFrame.
          explode
          (columnignore_index=False)
          它只有俩参数
          column:我们需要拆分的列名
          ignore_index:在拆分后形成的新的DataFrame中是否创建新的索引列,默认值为FALSE,也就是保留原DataFrame的index值
          下面这是官方文档给我们做的示例。

          assign的操作等同于data['颜色编码'] = data['颜色编码'].str.split(',') ,它可以给DataFrame重新分配一个新列(可以是新列,也可以覆盖原来的列)


          嗯。这么几行代码就搞定了拆分列到多行。



          第二部:合并多行到列


          完成了拆分之后,我们再来看看如何合并回去。
          python合并跟Excel Query的合并也是一个套路,都是通过合并分组然后提取其中的列表,把列表合并为分隔符分割的字符串。
            b = a.groupby(by=['index','产品编码']).apply(lambda x:','.join(x['颜色编码'])).reset_index().rename(columns={0:'颜色编码'})
            print(b)
            复制


            下面我们来逐步拆解下这一行代码都干了些啥!


            groupby

            groupby的作用,在pandas的文档中有专门的一章来介绍这个分组汇总-拆分-合并。由此可见,这个数据的分组汇总-数据拆分-数据合并的使用还是很普遍的。

            https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html

            DataFrame.
            groupby
            (by=Noneaxis=0level=Noneas_index=Truesort=True,group_keys=True,squeeze=<object object>observed=Falsedropna=True)
            参数较多,我们就说说这个by。
            by:用来进行分组的列。咱们上面用的是列表来表示。

            我们用groupby函数分组完成之后它会是一个什么样的东西呢?
            我们用一个for循环来查看下它的内部构造。我们 选取index为13033这个值的所有行。通过下面的操作,我们可以看到,groupby之后的结果就是一个元组列,一个表格列(这个表格列跟我们在Excel Query中分组之后的结果一样),这个表格列中每一个值里都是这行分组值对应的所有数据形成的表子集。

            我们对比下Excel Query分组合并之后的结果集的样子,跟pandas.DataFrame.groupby()之后的结果基本一样。


            搞清楚了groupby之后的结果集的样子,我们就更好的可以理解下面这段代码执行的意思了。

              .apply(lambda x:','.join(x['颜色编码']))
              复制

              join()是字符串连接函数。它可以把列表通过分隔符串联成一个字符串。如下图所示效果

              分组合并,然后把合并形成的表格子集中的颜色编码列合并成一个字符串后形成的结果集如下图所示

              我们将它重建索引

              然后对重建索引后的列名进行重命名

              这样我们就又把分拆之后的数据集合并回来了。

              整个过程我们所写代码不过10行不到,所耗时间也不过分分钟而已!


              用python来拆分数据的好处在于它的速度优势,1万多行的表拆分后变成了32万多行。如果数据集再大点,那么Excel Query就会非常卡。我之前用query拆分合并一个拆分后达到400万行的数据集耗费了我一下午时间,一直在转圈圈、圈圈、圈……而用Python来处理的话不过十分钟左右的事,这就是Python处理大数据集的速度优势。

              人生苦短,我用Python!




              一切皆是信息,万物源自比特!

              数字化必定会深刻革新我们的办公和生活!
              文章转载自龙小马的数字化之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论