将不同的条目拆分为单独的行,仅允许某些组合

时间:2014-08-27 10:35:58

标签: python csv pandas

我已经在网上搜索了一个答案,但是,虽然问了类似的问题,但它们并不相同,我也无法使用它们。

我有一个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个以逗号分隔的值...)。 / p>

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

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

1 个答案:

答案 0 :(得分:4)

如果您知道这三列始终具有相同数量的逗号分隔值,则可以执行以下操作:

>>> 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