将不同条目拆分为单独行,仅允许特定组合
我在网上找了很久想要的答案,虽然有类似的问题被问过,但它们并不完全一样,所以我没法用那些答案。
我有一个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