Python中的拆分和连接值

Posted

技术标签:

【中文标题】Python中的拆分和连接值【英文标题】:Split and concat values in Python 【发布时间】:2019-11-05 17:24:23 【问题描述】:

我有这个数据格式非常奇怪的 csv 文件。月份以 1 和 0 为真或假的列分隔,工作天数为单个字符串,以逗号分隔。

我需要将其更改为正常的日期类型,例如“日/月”,以便我可以进行一些分析。

我尝试使用 pandas 的 melt 方法来分隔列

dfs.melt(id_vars=['ID_INVENTORY','JOBISN','DAYS_JOB'], value_vars=['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DECE'])

之后我得到了这个结果

但由于 pandas 没有拆分方法,我真的不知道该怎么做,但我觉得我走在正确的道路上 xD

下面的示例数据(用“;”分隔)

JAN;FEB;MAR;APR;MAY;JUN;JUL;AUG;SEP;OCT;NOV;DECE;DAYS_JOB
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1;1;1;1;1;1;1;1;1;1;1;1;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31

【问题讨论】:

df.DAYS_JOB.str.split(',', expand=True) 可能会有所帮助 据我了解,您想将一行转换为多行吗? 是的,每天把它变成一个新行 如果您能提供一个示例来说明您期望输出数据框的外观而不是仅仅描述它,这将有所帮助 类似这样的:ID_INVENTORY;ID_CTRLM_JOB;DAY/MONTH 1044;1;01/jan 1044;1;02/jan 1044;1;03/jan 1044;1;04/jan 1044;1 ;05/jan 1044;1;06/jan 1044;1;07/jan 1044;1;08/jan 1044;1;09/jan 1044;1;10/jan 1044;1;11/jan 1044;1; 12/1044;1;13/1044;1;14/1044/1;1;15/1044;1;16/1044;1;17/1044;1;18/1044;1;01 /fev 【参考方案1】:

我假设 'DAYS_JOB' 列中的 1,2,3,4.... 是字符串格式。

在这种情况下,我们可以先用逗号分割字符串,转化为列表,然后使用pandas的explode函数将列表项展开成多条记录。 [df.explode doc]

代码如下:

df['DAYS_JOB'] = df['DAYS_JOB'].apply(lambda x: list(x.split(",")))
df = df.explode('DAYS_JOB') 

【讨论】:

@FZs 感谢您的建议!我已经更新了答案。

以上是关于Python中的拆分和连接值的主要内容,如果未能解决你的问题,请参考以下文章

我如何获取连接在多行值中的id的记录

(Python)如何修复数据框列值中的数值表示错误

Python 函数可以只返回两个值中的第二个吗?

xslt 1.0 中的拆分功能

通过解析列中的字符串值将表中的一行拆分为多行

如何在 python 的另一列中的字符串值中从数据框中的一列中搜索字符串?