【问题标题】:Split different entries into separate rows allowing only certain combinations将不同的条目拆分为单独的行,仅允许某些组合
【发布时间】:2014-08-27 10:35:58
【问题描述】:

我在网上搜索了答案,但是,虽然有人问过类似的问题,但它们并不相同,我无法使用它们。

我有一个 pandas 数据框,其中的几列文本字符串有时包含逗号分隔的值。我想拆分包含其中三个逗号分隔值的每个 CSV 字段,为每个条目创建一个新行,但以这种方式并行(使用 A、C 和 D,不使用 E):

In [10]: before 
Out[10]: 
    A        B    C            D         E
0  a1,a2,a3  1    c1, c2, c3   d1,d2,d3  e1,e2,e3
1  a4        2    c4           d4        e4

In [11]: after
Out[11]: 
      A    B     C    D     E
0    a1    1    c1   d1    e1,e2,e3
1    a2    1    c2   d2    e1,e2,e3
2    a3    1    c3   d3    e1,e2,e3
3    a4    2    c4   d4    e4

问题是,它应该适用于不同的表,并且所有这些表可能有不同的列(但总是这三个,A,C 和 D,共同的,具有相同的名称)。此外,其他列可能在某些未拆分的单元格中具有逗号分隔的值,就像 E 一样。

编辑:这三列在同一行中始终具有相同数量的逗号分隔值,但它可以在行之间有所不同(1 个值、2 个逗号分隔值、3 个逗号分隔值......)。

对不起,我想提供一些代码,但我无法提供任何远程有用的东西。

有人可以帮助我吗?我真的很感激任何帮助! :)

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    如果您知道三列始终具有相同数量的逗号分隔值,您可以这样做:

    >>> df
              A  B         C         D         E
    0  a1,a2,a3  1  c1,c2,c3  d1,d2,d3  e1,e2,e3
    1        a4  2        c4        d4        e4
    

    拆分每一列:

    >>> for col in ['A', 'C', 'D']:
    ...     df[col] = df[col].str.split(',')
    ... 
    >>> df
                  A  B             C             D         E
    0  [a1, a2, a3]  1  [c1, c2, c3]  [d1, d2, d3]  e1,e2,e3
    1          [a4]  2          [c4]          [d4]        e4
    

    定义索引器:

    >>> i = df['A'].map(len)
    >>> j = np.repeat(np.arange(len(df)), i)
    >>> k = np.concatenate(list(map(np.arange, i)))
    

    展开框架:

    >>> df = df.iloc[j]
    >>> df
                  A  B             C             D         E
    0  [a1, a2, a3]  1  [c1, c2, c3]  [d1, d2, d3]  e1,e2,e3
    0  [a1, a2, a3]  1  [c1, c2, c3]  [d1, d2, d3]  e1,e2,e3
    0  [a1, a2, a3]  1  [c1, c2, c3]  [d1, d2, d3]  e1,e2,e3
    1          [a4]  2          [c4]          [d4]        e4
    

    从每个列表中取一个:

    >>> for col in ['A', 'C', 'D']:
    ...     df[col] = list(map(lambda xs, i: xs[i], df[col], k))
    ... 
    >>> df
        A  B   C   D         E
    0  a1  1  c1  d1  e1,e2,e3
    0  a2  1  c2  d2  e1,e2,e3
    0  a3  1  c3  d3  e1,e2,e3
    1  a4  2  c4  d4        e4
    

    【讨论】:

    • 啊!我仍然不能投票给你的答案,对不起:(我刚刚意识到我并没有说它们在同一行中总是有相同数量的逗号分隔值,但有时它们在每个单元格上只有两个逗号分隔值同一行,其他时候它们将是每个单元格上的三个值,等等。这会影响您提供的解决方案吗?无论如何都非常感谢!
    • @Panda 你为什么不自己尝试/检查一下是否会受到影响?
    • 哇,这太漂亮了。一个问题(不确定这是否是一般性问题)是我需要将i 更改为list(i) 否则我在将数组从dtype('int64') 转换为dtype('int32') 时出错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2022-01-14
    • 1970-01-01
    • 2023-02-16
    • 2016-12-25
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多