将不同条目拆分为单独行,仅允许特定组合

4 投票
1 回答
1031 浏览
提问于 2025-04-18 18:41

我在网上找了很久想要的答案,虽然有类似的问题被问过,但它们并不完全一样,所以我没法用那些答案。

我有一个pandas的数据表,其中有几列是文本字符串,这些字符串有时包含用逗号分隔的值。我想把这几列中每个包含逗号分隔值的字段拆分开来,为每个值创建一个新行,但只针对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个逗号分隔值……)。

抱歉,我想提供一些代码,但我还没能写出任何有用的东西。

有人能帮我吗?我会非常感激任何帮助!:)

1 个回答

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

撰写回答