我正在使用一个大型的csv文件,并且最后一列的下一行有一个文本字符串,我希望通过特定的分隔符进行拆分 . 我想知道是否有一种简单的方法可以使用pandas或python来做到这一点?
CustNum CustomerName ItemQty Item Seatblocks ItemExt
32363 McCartney, Paul 3 F04 2:218:10:4,6 60
31316 Lennon, John 25 F01 1:13:36:1,12 1:13:37:1,13 300
我希望在空间 (' ')
中分割,然后在 Seatblocks
列中分割冒号 (':')
,但每个单元格会产生不同数量的列 . 我有一个重新排列列的功能,所以 Seatblocks
列位于工作表的末尾,但我不知道该怎么做 . 我可以使用内置的 text-to-columns
函数和一个快速宏在excel中完成它,但我的数据集有太多的记录供excel处理 .
最终,我想记录约翰列侬的记录并创建多条线,每组座位的信息都在一条单独的线上 .
3 回答
这会按空格分割Seatblocks并为每个子行分配自己的行 .
或者,将每个以冒号分隔的字符串放在其自己的列中:
这有点难看,但也许有人会用一个更漂亮的解决方案 .
与丹不同,我认为他的答案相当优雅......但不幸的是,这也是非常低效的 . 所以,既然问题提到了"a large csv file",那么让我建议尝试一个shell Dan的解决方案:
......与此替代方案相比:
... 还有这个:
第二个简单地避免分配100 000系列,这足以使其快10倍 . 但是第三个解决方案,有点讽刺的是浪费了很多对str.split()的调用(每行每列调用一次,所以比其他两个解决方案多三倍),比第一个快大约40倍,因为它甚至可以避免实例化10万个列表 . 是的,它肯定有点难看......
EDIT: this answer建议如何使用"to_list()"并避免需要lambda . 结果是这样的
这比第三种解决方案更有效,当然也更优雅 .
EDIT: 更简单
也有效,并且 almost 效率很高 .
EDIT: even simpler!并处理NaN(但效率较低):
链接的另一个类似解决方案是使用reset_index和rename:
如果在列中是 NOT
NaN
值,则最快的解决方案是使用list
comprehension与DataFrame
构造函数:但是如果列包含
NaN
只能使用参数expand=True
str.split返回DataFrame
(documentation),它解释了为什么它更慢: