2016-09-29 62 views
0

我有一个包含类似文本的组成列大熊猫DF:解析大熊猫DF柱与正则表达式提取子

String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text 

我可以看到:

  1. 文本的开始总是包含我想提取的第一个字符串
  2. 其余字符串位于“::”和“;”之间

我想创建一个包含新的列:

String1, String2, String3, String4 

一个逗号,但仍然在同一列中的所有separed。

如何解决问题?

感谢您的帮助

回答

0

str.split组合,我只想应用lambda函数首先做的“你想要做的(拆分操作;“,然后拆分”::“并保留第一个元素,并将它们加入):

df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t.split("::")[0] for t in s.split(";"))) 

您也可避免分裂的::由于第一:之前简单地停止就够了:

df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t[:t.index(":")] for t in s.split(";"))) 
1

试试这个:

In [136]: df.txt.str.findall(r'String\d+').str.join(', ') 
Out[136]: 
0 String1, String2, String3, String4 
Name: txt, dtype: object 

数据:

In [137]: df 
Out[137]: 
                            txt 
0 String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_t... 

设置:

df = pd.DataFrame({'txt': ['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text']}) 
+0

我去查看列的D型细胞和它的“对象”。我不能设法编码它,因为它说..“UnicodeEncodeError:'ascii'编解码器不能编码字符u'\ xae'在位置1679:序号不在范围(128)”当我尝试:df.column。 astype(STR)。它的工作原理是 – xxxvinxxx

0

考虑数据框df与列txt

df = pd.DataFrame(['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text'] * 10, 
        columns=['txt']) 
df 

enter image description here


使用和groupby

df.txt.str.split(';', expand=True).stack() \ 
     .str.split('::').str[0].groupby(level=0).apply(list) 

0 [String1, String2, String3, String4] 
1 [String1, String2, String3, String4] 
2 [String1, String2, String3, String4] 
3 [String1, String2, String3, String4] 
4 [String1, String2, String3, String4] 
5 [String1, String2, String3, String4] 
6 [String1, String2, String3, String4] 
7 [String1, String2, String3, String4] 
8 [String1, String2, String3, String4] 
9 [String1, String2, String3, String4] 
dtype: object 
+0

。但我不明白为什么应用它的列表方法。我如何将它作为前一个数据框中的一个简单的新列? – xxxvinxxx

+0

@xxxvinxxx列表函数将一个迭代变成一个列表。将它分配给一个数据框列,并且你有你想要的。 – piRSquared