在pandas数据框中将单元格拆分为多行

我有一个包含订单数据的数据框,每个订单都有多个存储为逗号分隔的字符串[ package&package_code]列的包


我想拆分包裹数据并为每个包裹创建一行,包括其订单明细


这是一个示例输入数据框:


import pandas as pd

df = pd.DataFrame({"order_id":[1,3,7],"order_date":["20/5/2018","22/5/2018","23/5/2018"], "package":["p1,p2,p3","p4","p5,p6"],"package_code":["#111,#222,#333","#444","#555,#666"]})

http://img4.mukewang.com/5d9fea0000018e8e08680299.jpg

这就是我想要实现的输出结果: 

http://img3.mukewang.com/5d9fea0500016f0d08410479.jpg

我该如何用熊猫呢?


慕尼黑8549860
浏览 1858回答 3
3回答

沧海一幻觉

这是使用numpy.repeat和的一种方法itertools.chain。从概念上讲,这正是您想要做的:重复某些值,链接其他值。建议用于少量的列,否则stack基于方法的方法可能会更好。import numpy as npfrom itertools import chain# return list from series of comma-separated stringsdef chainer(s):    return list(chain.from_iterable(s.str.split(',')))# calculate lengths of splitslens = df['package'].str.split(',').map(len)# create new dataframe, repeating or chaining as appropriateres = pd.DataFrame({'order_id': np.repeat(df['order_id'], lens),                    'order_date': np.repeat(df['order_date'], lens),                    'package': chainer(df['package']),                    'package_code': chainer(df['package_code'])})print(res)   order_id order_date package package_code0         1  20/5/2018      p1         #1110         1  20/5/2018      p2         #2220         1  20/5/2018      p3         #3331         3  22/5/2018      p4         #4442         7  23/5/2018      p5         #5552         7  23/5/2018      p6         #666

江户川乱折腾

这适用于任何数量的列,例如这样。本质是带有的一点堆叠-堆叠功能str.split。(df.set_index(['order_date', 'order_id'])   .stack()   .str.split(',', expand=True)   .stack()   .unstack(-2)   .reset_index(-1, drop=True)   .reset_index())  order_date  order_id package package_code0  20/5/2018         1      p1         #1111  20/5/2018         1      p2         #2222  20/5/2018         1      p3         #3333  22/5/2018         3      p4         #4444  23/5/2018         7      p5         #5555  23/5/2018         7      p6         #666还有另一个涉及的性能替代方案chain,但是您需要显式地链接并重复每列(很多列都有问题)。由于没有单一答案,因此请选择最适合您问题描述的内容。细节首先,将不被触及的列设置为索引。df.set_index(['order_date', 'order_id'])                      package    package_codeorder_date order_id                          20/5/2018  1         p1,p2,p3  #111,#222,#33322/5/2018  3               p4            #44423/5/2018  7            p5,p6       #555,#666接下来,stack行。_.stack()order_date  order_id              20/5/2018   1         package               p1,p2,p3                      package_code    #111,#222,#33322/5/2018   3         package                     p4                      package_code              #44423/5/2018   7         package                  p5,p6                      package_code         #555,#666dtype: object我们现在有一系列。因此请str.split使用逗号。_.str.split(',', expand=True)                                     0     1     2order_date order_id                               20/5/2018  1        package         p1    p2    p3                    package_code  #111  #222  #33322/5/2018  3        package         p4  None  None                    package_code  #444  None  None23/5/2018  7        package         p5    p6  None                    package_code  #555  #666  None我们需要摆脱NULL值,因此stack再次调用。_.stack()order_date  order_id                 20/5/2018   1         package       0      p1                                    1      p2                                    2      p3                      package_code  0    #111                                    1    #222                                    2    #33322/5/2018   3         package       0      p4                      package_code  0    #44423/5/2018   7         package       0      p5                                    1      p6                      package_code  0    #555                                    1    #666dtype: object我们快到了。现在我们希望索引的倒数第二层成为我们的列,因此使用unstack(-2)(unstack在倒数第二层)上的堆栈_.unstack(-2)                      package package_codeorder_date order_id                       20/5/2018  1        0      p1         #111                    1      p2         #222                    2      p3         #33322/5/2018  3        0      p4         #44423/5/2018  7        0      p5         #555                    1      p6         #666使用reset_index以下命令摆脱多余的最后一级:_.reset_index(-1, drop=True)                    package package_codeorder_date order_id                     20/5/2018  1             p1         #111           1             p2         #222           1             p3         #33322/5/2018  3             p4         #44423/5/2018  7             p5         #555           7             p6         #666最后,_.reset_index()  order_date  order_id package package_code0  20/5/2018         1      p1         #1111  20/5/2018         1      p2         #2222  20/5/2018         1      p3         #3333  22/5/2018         3      p4         #4444  23/5/2018         7      p5         #5555  23/5/2018         7      p6         #666
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python