我已经在网上搜索了一个答案,但是,虽然问了类似的问题,但它们并不相同,我也无法使用它们。
我有一个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>
对不起,我想提供一些代码,但我无法做出任何有用的东西。
有人能帮助我吗?我真的很感激任何帮助! :)
答案 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