【问题标题】:Split cells in one column by comma into multiple rows in Pandas在 Pandas 中,用逗号将一列中的单元格拆分为多行
【发布时间】:2019-05-07 15:58:13
【问题描述】:

对于如下输入数据,我想用逗号将列office_number拆分成多行:

df = pd.DataFrame({'id':['1010084420','1010084420','1010084420','1010084421','1010084421','1010084421','1010084425'],
                   'building_name': ['A', 'A', 'A', 'East Tower', 'East Tower', 'West Tower', 'T1'],
                   'floor': ['1', '1', '2', '10', '10', '11','11'],
                   'office_number':['101-105', '106', '201-203, 205, 208', '1001-1005', '1006, 1008, 1010', '1101-1103', '1101-1105'],
                   'company_name': ['Ariel Resources Ltd.', 'A.O. Tatneft', '', 'Agrium Inc.', 'Creo Products Inc.', 'Cott Corp.', 'Creo Products Inc.']})

这是我参考here的解决方案:

res = (df.set_index(['id', 'building_name', 'floor', 'company_name'])
   .stack()
   .str.split(',', expand=True)
   .stack()
   .unstack(-2)
   .reset_index(-1, drop=True)
   .reset_index())

result = res[['id', 'building_name', 'floor', 'office_number', 'company_name']]

print(result)

输出:

            id building_name floor office_number          company_name
0   1010084420             A     1           106          A.O. Tatneft
1   1010084420             A     1       101-105  Ariel Resources Ltd.
2   1010084420             A     2       201-203                      
3   1010084420             A     2           205                      
4   1010084420             A     2           208                      
5   1010084421    East Tower    10     1001-1005           Agrium Inc.
6   1010084421    East Tower    10          1006    Creo Products Inc.
7   1010084421    East Tower    10          1008    Creo Products Inc.
8   1010084421    East Tower    10          1010    Creo Products Inc.
9   1010084421    West Tower    11     1101-1103            Cott Corp.
10  1010084425            T1    11     1101-1105    Creo Products Inc.

如果您有其他解决方案,欢迎分享。谢谢。

【问题讨论】:

  • 这个解决方案有什么不好的地方吗?其他解决方案的原因是什么?
  • 没有,很好,就是想知道有没有其他的解决方案。顺便说一句,我已经尝试了参考链接中接受的解决方案,但没有成功。
  • 这是不可能的(因为你不在那里提问),但你可以投票。

标签: python pandas


【解决方案1】:

另一种解决方案是通过DataFrame.popsplitstackSeriesDataFrame.join 的列提取到原始:

s = (df.pop('office_number')
       .str.split(',', expand=True)
       .stack()
       .reset_index(1, drop=True)
       .rename('office_number'))

res = df.join(s).reset_index(drop=True)
result = res[['id', 'building_name', 'floor', 'office_number', 'company_name']]

print(result)
            id building_name floor office_number          company_name
0   1010084420             A     1       101-105  Ariel Resources Ltd.
1   1010084420             A     1           106          A.O. Tatneft
2   1010084420             A     2       201-203                      
3   1010084420             A     2           205                      
4   1010084420             A     2           208                      
5   1010084421    East Tower    10     1001-1005           Agrium Inc.
6   1010084421    East Tower    10          1006    Creo Products Inc.
7   1010084421    East Tower    10          1008    Creo Products Inc.
8   1010084421    East Tower    10          1010    Creo Products Inc.
9   1010084421    West Tower    11     1101-1103            Cott Corp.
10  1010084425            T1    11     1101-1105    Creo Products Inc.

【讨论】:

  • 对不起,我还有一个问题,如果我需要用多个分隔符分割单元格,除了逗号,例如斜线,我该怎么办?我尝试使用 s = (df.pop('office_number') .str.split('/' or ',', expand=True) .stack() .reset_index(1, drop=True) .rename('office_number')),但出现 KeyError。
  • @ahbon - 正则表达式需要 | 或 - stackoverflow.com/a/53605756/2901002
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2021-05-21
  • 2017-04-16
  • 1970-01-01
  • 2018-11-02
  • 2021-09-24
相关资源
最近更新 更多