2016-09-29 66 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