【问题标题】:Numbering for Rows generated through comma separated Pandas DataFrame通过逗号分隔的 Pandas DataFrame 生成的行编号
【发布时间】:2021-06-16 07:47:55
【问题描述】:

我有一个 Pandas DataFrame 如下:

+----------+---------------+-----------+---------------+
| List No. | List Item No. | Item Name |    Issues     |
+----------+---------------+-----------+---------------+
|        1 | 1             | A         | foo, bar, baz |
|        1 | 2             | B         | foo, bar      |
|        2 | 3A            | A         | bar, quz      |
|        2 | 3B            | C         | baz, foo, quz |
+----------+---------------+-----------+---------------+

以上可以使用以下代码生成

data = {'List No.':['1', '1', '2', '2'],
        'List Item No.':['1', '2', '3A', '3B'],
        'Item Name':['A', 'B', 'A', 'C'],
        'Issues':['foo, bar, baz','foo, bar', 'bar, quz', 'baz, foo, quz']}

df = pd.DataFrame(data)

我想根据Issues 中存在的值的数量创建行。例如有 3 个逗号分隔值,所以我想创建 3 行。每个值 1。这可以使用[item for sublist in df.Issues.str.split(',').tolist() for item in sublist] 来完成。但是,我也想创建我无法做到的问题编号。

预期输出

+----------+---------------+-----------+-----------+-------+
| List No. | List Item No. | Item Name | Issue No. | Issue |
+----------+---------------+-----------+-----------+-------+
|        1 | 1             | A         |         1 | foo   |
|        1 | 1             | A         |         2 | bar   |
|        1 | 1             | A         |         3 | baz   |
|        1 | 2             | B         |         1 | foo   |
|        1 | 2             | B         |         2 | bar   |
|        2 | 3A            | A         |         1 | bar   |
|        2 | 3A            | A         |         2 | quz   |
|        2 | 3B            | C         |         1 | baz   |
|        2 | 3B            | C         |         2 | foo   |
|        2 | 3B            | C         |         3 | quz   |
+----------+---------------+-----------+-----------+-------+

【问题讨论】:

    标签: python pandas group-by split pandas-melt


    【解决方案1】:

    DataFrame.explodeGroupBy.cumcount 一起使用:

    df1 = df.assign(Issues = df.Issues.str.split(',')).explode('Issues')
    df1['Issue No.'] = df1.groupby(level=0).cumcount().add(1)
    

    如果列的位置很重要,请使用DataFrame.insert:

    df1.insert(3, 'Issue No.', df1.groupby(level=0).cumcount().add(1))
    
    print (df1)
      List No. List Item No. Item Name  Issue No. Issues
    0        1             1         A          1    foo
    0        1             1         A          2    bar
    0        1             1         A          3    baz
    1        1             2         B          1    foo
    1        1             2         B          2    bar
    2        2            3A         A          1    bar
    2        2            3A         A          2    quz
    3        2            3B         C          1    baz
    3        2            3B         C          2    foo
    3        2            3B         C          3    quz
    

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多