查看原文
其他

Pandas: 如何将一列中的文本拆分为多行?

LEMON Python数据之道 2022-04-24


    在数据处理过程中,经常会遇到以下类型的数据:

    在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行。

    在上图中,列名为"Country" ,index为4和5的单元格内,值为"UK/Australia"和"UK/Netherland"。

    今天,我们来介绍将含有多值的内容分拆成多行的几种方法。

    加载数据

    PS:可以通过左右滑动来查看代码

    1. import pandas as pd

    2. df = pd.DataFrame({'Country':['China','US','Japan','EU','UK/Australia', 'UK/Netherland'],

    3.               'Number':[100, 150, 120, 90, 30, 2],

    4.               'Value': [1, 2, 3, 4, 5, 6],

    5.               'label': list('abcdef')})

    6. df

    7. Out[2]:

    8.         Country  Number  Value label

    9. 0          China     100      1     a

    10. 1             US     150      2     b

    11. 2          Japan     120      3     c

    12. 3             EU      90      4     d

    13. 4   UK/Australia      30      5     e

    14. 5  UK/Netherland       2      6     f

    1 Method-1

    分为如下几步:

    1. 将含有多值的列进行拆分,然后通过 stack()方法进行变换,并通过index的设置来完成

    2. 用 drop()方法从DataFrame中删除含有多值的列

    3. 然后用 join()方法来合并

    1. df.drop('Country', axis=1).join(df['Country'].str.split('/', expand=True).stack().reset_index(level=1, drop=True).rename('Country'))

    2. Out[3]:

    3.   Number  Value label     Country

    4. 0     100      1     a       China

    5. 1     150      2     b          US

    6. 2     120      3     c       Japan

    7. 3      90      4     d          EU

    8. 4      30      5     e          UK

    9. 4      30      5     e   Australia

    10. 5       2      6     f          UK

    11. 5       2      6     f  Netherland

    过程分步介绍

    1. df['Country'].str.split('/', expand=True).stack()

    2. Out[4]:

    3. 0  0         China

    4. 1  0            US

    5. 2  0         Japan

    6. 3  0            EU

    7. 4  0            UK

    8.   1     Australia

    9. 5  0            UK

    10.   1    Netherland

    11. dtype: object

    12. df['Country'].str.split('/', expand=True).stack().reset_index(level=1, drop=True)

    13. Out[5]:

    14. 0         China

    15. 1            US

    16. 2         Japan

    17. 3            EU

    18. 4            UK

    19. 4     Australia

    20. 5            UK

    21. 5    Netherland

    22. dtype: object

    23. df['Country'].str.split('/', expand=True).stack().reset_index(level=1, drop=True).rename('Country')

    24. Out[6]:

    25. 0         China

    26. 1            US

    27. 2         Japan

    28. 3            EU

    29. 4            UK

    30. 4     Australia

    31. 5            UK

    32. 5    Netherland

    33. Name: Country, dtype: object

    34. df.drop('Country', axis=1)

    35. Out[7]:

    36.   Number  Value label

    37. 0     100      1     a

    38. 1     150      2     b

    39. 2     120      3     c

    40. 3      90      4     d

    41. 4      30      5     e

    42. 5       2      6     f

    2 Method-2

    该方法的思路跟Method-1基本是一样的,只是在具体的细节方面有些差异。代码如下:

    1. df['Country'].str.split('/', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'Country'}).join(df.drop('Country', axis=1))

    2. Out[8]:

    3.      Country  Number  Value label

    4. 0       China     100      1     a

    5. 1          US     150      2     b

    6. 2       Japan     120      3     c

    7. 3          EU      90      4     d

    8. 4          UK      30      5     e

    9. 4   Australia      30      5     e

    10. 5          UK       2      6     f

    11. 5  Netherland       2      6     f

    过程分步介绍如下:

    1. df['Country'].str.split('/', expand=True).stack().reset_index(level=0)

    2. Out[9]:

    3.   level_0           0

    4. 0        0       China

    5. 0        1          US

    6. 0        2       Japan

    7. 0        3          EU

    8. 0        4          UK

    9. 1        4   Australia

    10. 0        5          UK

    11. 1        5  Netherland

    12. df['Country'].str.split('/', expand=True).stack().reset_index(level=0).set_index('level_0')

    13. Out[10]:

    14.                  0

    15. level_0            

    16. 0             China

    17. 1                US

    18. 2             Japan

    19. 3                EU

    20. 4                UK

    21. 4         Australia

    22. 5                UK

    23. 5        Netherland

    24. df['Country'].str.split('/', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'Country'})

    25. Out[11]:

    26.            Country

    27. level_0            

    28. 0             China

    29. 1                US

    30. 2             Japan

    31. 3                EU

    32. 4                UK

    33. 4         Australia

    34. 5                UK

    35. 5        Netherland

    36. df.drop('Country', axis=1)

    37. Out[12]:

    38.   Number  Value label

    39. 0     100      1     a

    40. 1     150      2     b

    41. 2     120      3     c

    42. 3      90      4     d

    43. 4      30      5     e

    44. 5       2      6     f

    3 闲谈

    当然,将某列中含有多值的单元拆分成多行,还有其他方法,各位小伙伴们可以研究下~~

    本期推荐阅读:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存