【问题标题】:Split Dataframe column on delimiter when number of strings to split is not definite当要拆分的字符串数量不确定时,在分隔符上拆分数据框列
【发布时间】:2021-05-12 07:58:18
【问题描述】:

我有一个如下的数据框:

    A              B
0   33590104       3359017;3359011;3359031
1   53340311       5334012
2   160750035      16075131;16075132;16075135;16075046
3   10510044       1051012;1051097;1051010;1051051;1051089;105106...
4   51540061       5154036

我希望 A 中的每个值都有行,B 中的每个值都用 ';' 分隔如下所示

   A              B
   33590104       3359017
   33590104       3359011
   33590104       3359031
   53340311       5334012
   160750035      16075131
   160750035      16075132
   160750035      16075135
   160750035      16075046

等等……

我的想法是首先将 B 列中的字符串转换为列表。例如:

        A              B
   0    33590104       [3359017,3359011,3359031]
   1    53340311       [5334012]
   2    160750035      [16075131,16075132,16075135,16075046]

然后使用explode功能。但我不知道如何使用分隔符';'转换字符串到一个列表。我也不知道到底有多少个字符串被 ';' 分隔在每一行。正如您在上面的示例中所见,它因每一行而异。

【问题讨论】:

  • I don't know exactly how many strings are separated by ';' 你不用担心,series.str.split(";") 会帮你搞定

标签: pandas explode


【解决方案1】:

你可以使用splitexplode方法:

df['B'] = df['B'].str.split(';')
df.explode('B', ignore_index=True)

df.assign(B=df['B'].str.split(';')).explode('B', ignore_index=True)

输出:

            A          B
0    33590104    3359017
1    33590104    3359011
2    33590104    3359031
3    53340311    5334012
4   160750035   16075131
5   160750035   16075132
6   160750035   16075135
7   160750035   16075046
8    10510044    1051012
9    10510044    1051097
10   10510044    1051010
11   10510044    1051051
12   10510044    1051089
13   10510044  105106...
14   51540061    5154036

【讨论】:

    【解决方案2】:

    您可以将您的字符串转换为在.map() 方法中使用字符串.split() 列出:

    df['B'] = df['B'].map(lambda x: x.split(';'))
    

    然后使用.explode():

    df.explode('B').reset_index(drop=True)
    

    【讨论】:

    • 如果我除了 A 和 B 之外还有其他列,它会起作用吗?
    • 对于多个列,您可以尝试以下操作:df.set_index(['B']).apply(pd.Series.explode).reset_index()
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多