Python 在熊猫中通过数据帧描绘两次

Python 在熊猫中通过数据帧描绘两次,python,pandas,Python,Pandas,我有一个稀疏的熊猫数据帧/系列,其值看起来像是AB1234:12、CD5678:34、EF3456:56的变体。大意是 "AB1234:12, CD5678:34, EF3456:56" "AB1234:12, CD5678:34" NaN "GH5678:34, EF3456:56" "OH56:34" 我想把它转换成 ["AB1234","CD5678", "EF3456"] ["AB1234","CD5678"] NaN ["GH5678","EF3456"] ["OH56"] 事实证

我有一个稀疏的熊猫数据帧/系列,其值看起来像是AB1234:12、CD5678:34、EF3456:56的变体。大意是

"AB1234:12, CD5678:34, EF3456:56"
"AB1234:12, CD5678:34"
NaN
"GH5678:34, EF3456:56"
"OH56:34"
我想把它转换成

["AB1234","CD5678", "EF3456"]
["AB1234","CD5678"]
NaN
["GH5678","EF3456"]
["OH56"]
事实证明,这种“双重划分”是困难的。我知道我们可以
A=df[“columnName”].str.split(“,”)
,但是我遇到了一些问题,包括
。split(“,”)
似乎不起作用,.split(“,”)会留下空白。此外,在生成的
A
中迭代和拆分似乎将我的新列表解释为“浮动”。虽然最后一个问题可能是ipython的技术难题,但我也在努力解决这个问题

有没有办法描述两种类型的分离器,而不是一种?如果不是,您如何执行循环来迭代内部列表

//编辑:将撇号改为逗号-那只是我的阅读障碍 踢进

这是您的数据帧

>>> df
                                 A
0  AB1234:12, CD5678:34, EF3456:56
1             AB1234:12, CD5678:34
2                             None
3             GH5678:34, EF3456:56
4                          OH56:34
现在我使用
split
replace
拆分为
,“
并删除所有
”:“

>>> df.A = [i.replace(':','').split(", ") if isinstance(i,str) else i for i in df.A]
>>> df.A
0    [AB123412, CD567834, EF345656]
1              [AB123412, CD567834]
2                              None
3              [GH567834, EF345656]
4                          [OH5634]
Name: A

请注意,您可以使用正则表达式进行更一般的拆分:

In [11]: s2
Out[11]:
0    AB1234:12, CD5678:34, EF3456:56
1               AB1234:12, CD5678:34
2                                NaN
3               GH5678:34, EF3456:56
4                            OH56:34
dtype: object

In [12]: s2.str.split(", '")
Out[12]:
0    [AB1234:12, CD5678:34, EF3456:56]
1               [AB1234:12, CD5678:34]
2                                  NaN
3               [GH5678:34, EF3456:56]
4                            [OH56:34]
dtype: object

In [13]: s2.str.split("\s*,\s*'")
Out[13]:
0    [AB1234:12, CD5678:34, EF3456:56]
1               [AB1234:12, CD5678:34]
2                                  NaN
3               [GH5678:34, EF3456:56]
4                            [OH56:34]
dtype: object

这将删除逗号前后的空格。

抱歉-我确实使用了逗号-我刚刚编辑了问题。我设法做到了这一点,并且正在研究如何通过
“:”
s描述这些列表。然后删除嵌入列表中的第二项,但是该部分很容易管理,不在问题的范围内。更新了我的答案。希望这就是你想要的!几乎!我不清楚,需要去掉
后面的数字/分数。我想这将创建一个或多个列表,并可以删除每个嵌入列表的第二项-分数。然而,正则表达式路径似乎缩短了这一点。在您提到正则表达式的提示下,我发现:
s2.apply(lambda x:re.split(':\d{1,3},\s',x))
非常接近。我对regex不是很熟悉,所以这只是我拼凑的东西。由于最后一个
:\d\d
模式,我在末尾得到一个空列表项,我不知道如何通过正则表达式消除它。@dbyte哦,我明白了,我错过了:位。首先执行正则表达式替换:
s2.str.replace(“:\d+”,“”).str.split(“\s*,\s*”)
。完美!尽管数据的结构为
(“,\s*”)
。可怕的负鼠。@dbyte星星的意思是“0或更多”(所以它不在乎):)