第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在pandas數(shù)據(jù)框中將單元格拆分為多行

在pandas數(shù)據(jù)框中將單元格拆分為多行

慕尼黑8549860 2019-10-11 10:33:07
我有一個(gè)包含訂單數(shù)據(jù)的數(shù)據(jù)框,每個(gè)訂單都有多個(gè)存儲(chǔ)為逗號(hào)分隔的字符串[ package&package_code]列的包我想拆分包裹數(shù)據(jù)并為每個(gè)包裹創(chuàng)建一行,包括其訂單明細(xì)這是一個(gè)示例輸入數(shù)據(jù)框:import pandas as pddf = 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"]})這就是我想要實(shí)現(xiàn)的輸出結(jié)果: 我該如何用熊貓呢?
查看完整描述

3 回答

?
滄海一幻覺(jué)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是使用numpy.repeat和的一種方法itertools.chain。從概念上講,這正是您想要做的:重復(fù)某些值,鏈接其他值。建議用于少量的列,否則stack基于方法的方法可能會(huì)更好。


import numpy as np

from itertools import chain


# return list from series of comma-separated strings

def chainer(s):

    return list(chain.from_iterable(s.str.split(',')))


# calculate lengths of splits

lens = df['package'].str.split(',').map(len)


# create new dataframe, repeating or chaining as appropriate

res = 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_code

0         1  20/5/2018      p1         #111

0         1  20/5/2018      p2         #222

0         1  20/5/2018      p3         #333

1         3  22/5/2018      p4         #444

2         7  23/5/2018      p5         #555

2         7  23/5/2018      p6         #666


查看完整回答
反對(duì) 回復(fù) 2019-10-11
?
江戶川亂折騰

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊

這適用于任何數(shù)量的列,例如這樣。本質(zhì)是帶有的一點(diǎn)堆疊-堆疊功能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_code

0  20/5/2018         1      p1         #111

1  20/5/2018         1      p2         #222

2  20/5/2018         1      p3         #333

3  22/5/2018         3      p4         #444

4  23/5/2018         7      p5         #555

5  23/5/2018         7      p6         #666

還有另一個(gè)涉及的性能替代方案chain,但是您需要顯式地鏈接并重復(fù)每列(很多列都有問(wèn)題)。由于沒(méi)有單一答案,因此請(qǐng)選擇最適合您問(wèn)題描述的內(nèi)容。


細(xì)節(jié)


首先,將不被觸及的列設(shè)置為索引。


df.set_index(['order_date', 'order_id'])


                      package    package_code

order_date order_id                          

20/5/2018  1         p1,p2,p3  #111,#222,#333

22/5/2018  3               p4            #444

23/5/2018  7            p5,p6       #555,#666

接下來(lái),stack行。


_.stack()


order_date  order_id              

20/5/2018   1         package               p1,p2,p3

                      package_code    #111,#222,#333

22/5/2018   3         package                     p4

                      package_code              #444

23/5/2018   7         package                  p5,p6

                      package_code         #555,#666

dtype: object

我們現(xiàn)在有一系列。因此請(qǐng)str.split使用逗號(hào)。


_.str.split(',', expand=True)


                                     0     1     2

order_date order_id                               

20/5/2018  1        package         p1    p2    p3

                    package_code  #111  #222  #333

22/5/2018  3        package         p4  None  None

                    package_code  #444  None  None

23/5/2018  7        package         p5    p6  None

                    package_code  #555  #666  None

我們需要擺脫NULL值,因此stack再次調(diào)用。


_.stack()


order_date  order_id                 

20/5/2018   1         package       0      p1

                                    1      p2

                                    2      p3

                      package_code  0    #111

                                    1    #222

                                    2    #333

22/5/2018   3         package       0      p4

                      package_code  0    #444

23/5/2018   7         package       0      p5

                                    1      p6

                      package_code  0    #555

                                    1    #666

dtype: object

我們快到了?,F(xiàn)在我們希望索引的倒數(shù)第二層成為我們的列,因此使用unstack(-2)(unstack在倒數(shù)第二層)上的堆棧


_.unstack(-2)


                      package package_code

order_date order_id                       

20/5/2018  1        0      p1         #111

                    1      p2         #222

                    2      p3         #333

22/5/2018  3        0      p4         #444

23/5/2018  7        0      p5         #555

                    1      p6         #666

使用reset_index以下命令擺脫多余的最后一級(jí):


_.reset_index(-1, drop=True)


                    package package_code

order_date order_id                     

20/5/2018  1             p1         #111

           1             p2         #222

           1             p3         #333

22/5/2018  3             p4         #444

23/5/2018  7             p5         #555

           7             p6         #666

最后,


_.reset_index()


  order_date  order_id package package_code

0  20/5/2018         1      p1         #111

1  20/5/2018         1      p2         #222

2  20/5/2018         1      p3         #333

3  22/5/2018         3      p4         #444

4  23/5/2018         7      p5         #555

5  23/5/2018         7      p6         #666


查看完整回答
反對(duì) 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 1876 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)