使用正则表达式在Pandas Series的单个单元格中单独使用逗号分隔值

时间:2016-09-09 22:09:31

标签: python regex pandas split

我有一个来自数据库的csv文件我已经转换为我正在尝试清理的Pandas DataFrame。其中一个问题是已将多个值输入到需要拆分的单个单元格中。复杂因素是存在需要保持完整的字符串注释(也使用逗号)。以下示例以系列形式说明了该问题。

我有什么:

Index  |  values    
0      | 2.54,3.563
1      | bad design, right?

我想要的是什么:

Index  |   level_0   |  values      
0      |     0       |    2.54   
1      |     0       |    3.563 
2      |     1       |    bad design, right?      

正如您所看到的,有逗号分隔我想要分割的值,逗号后面没有后续空格,而字符串注释中的逗号都有空格。似乎很容易将正则表达式应用于拆分。我使用从另一个StackOverflow解决方案获取的策略,下面的解决方案是使用Series.str.split将值分隔为单独的列,然后堆叠列。这个策略很有效。但是,在这种情况下,正则表达式显然不能识别分裂。这是我的代码:

Import pandas as pd

# Example Series:
data = pd.Series(("2.54,3.56", "3.24,5.864", "bad design, right?"), name = "values")

# Split cells with multiple entries into separate rows 
split_data = data.str.split('[,]\b').apply(pd.Series)

# Stack the results and pull out the index into a column (which is sample number in my case)
split_data = split_data.stack().reset_index(0)
split_data = split_data.reset_index(drop=True)

我是正则表达式的新手,但是从我看过的指南和使用特定于Python的几个正则表达式沙箱,似乎正则表达式[,] \ b应该拆分值,而不是注释。但是,它不会与此正则表达式分开任何内容。

这是调试器的结果,它说这应该有效: Debuggex Demo

我在这里错过了一些简单的东西吗?有关这项工作的更好的想法吗?我正在使用Python 3.5,如果这有所作为。感谢。

1 个答案:

答案 0 :(得分:1)

我倾向于使用前瞻;你如何这样做取决于你的预期数据。

这是一个负面的预测。它说"一个没有空格的逗号"如果您确定所有带逗号的评论都有空格,并希望对待"红色,绿色"作为分裂的东西。

data.str.split('[,](?!\s)').apply(pd.Series)

对于看起来像有效值的东西,另一种选择是积极向前看;你的例子是数字,所以例如,这只会在逗号后面跟一个数字分开:

data.str.split('[,](?:\d)').apply(pd.Series)

正则表达式非常强大,但老实说,如果这是一个长期问题,我不确定这个解决方案对你有用。将大多数情况作为一次性迁移应该是正常的,但从长远来看,我会考虑在问题到达之前尝试解决问题。无论如何,这是Debuggex的python正则表达式备忘单,以防它对您有用:https://www.debuggex.com/cheatsheet/regex/python