2017-04-17 167 views
2

我有以下的數據幀,我想給col2的分成多列:大熊貓拆分數據幀列

輸入數據幀:

>>> mydf= pd.DataFrame({'Col1':['AA','AB','AAC'], 'Col2':['AN||Ind(0.9)','LN||RED(8.9)','RN||RED(9.8)'], 'Col3':['log1','log2','log3']}) 

>>> mydf 
    Col1  Col2  Col3 
0 AA AN||Ind(0.9) log1 
1 AB LN||RED(8.9) log2 
2 AAC RN||RED(9.8) log3 

期望中的數據框:

Col1 Col2 Col3 Col4 Col5 
0 AA AN log1 Ind 0.9 
1 AB LN log2 RED 8.9 
2 AAC RN log3 RED 9.8 

我開始與申請,但以下將採取幾個步驟。任何捷徑?

mydf['Col4']=mydf['Col2'].apply(lambda x: str(x).split('||')[0]) 

爲什麼下面拋出一個valuerror也有點糊塗:

mydf['Col2'].str.split('||', expand=True) 

ValueError: split() requires a non-empty pattern match. 

回答

4

您可以str.extractassign

regex = '(?P<Col2>.*)\|{2,}(?P<Col4>.*)\((?P<Col5>.*)\)' 
mydf.assign(**mydf.Col2.str.extract(regex, expand=True).to_dict('list')) 

    Col1 Col2 Col3 Col4 Col5 
0 AA AN log1 Ind 0.9 
1 AB LN log2 RED 8.9 
2 AAC RN log3 RED 9.8 

或等價拆出列與combine_first

regex = '(?P<Col2>.*)\|{2,}(?P<Col4>.*)\((?P<Col5>.*)\)' 
mydf.Col2.str.extract(regex, expand=True).combine_first(mydf) 

    Col1 Col2 Col3 Col4 Col5 
0 AA AN log1 Ind 0.9 
1 AB LN log2 RED 8.9 
2 AAC RN log3 RED 9.8 

解釋

它使用正則表達式來解析Col2值,並在同一時間分配列名

regex = '(?P<Col2>.*)\|{2,}(?P<Col4>.*)\((?P<Col5>.*)\)' 
  • '(?P<Col2>.*)\|{2,}'會抓住一切直到第一雙|和呼叫它Col2
  • '(?P<Col4>.*)'抓住一切直到括號並調用它Col4
  • '\((?P<Col5>.*)\)'抓住一切括號內,並調用它Col5
  • 最後,我們要麼重新分配Col2覆蓋現有Col2,或者我們使用combine_first,我們默認爲新制定的Col2值。
2

@piRSquared的答案與往常一樣令人驚歎,而且我只是發佈了我的方法。我只是保持它很簡單

mydf[['Col2', 'Col4', 'Col5']]= mydf.Col2.str.extract('(.*?)\|\|(.*?)\((.*?)\)', expand = True) 

Col2會自動重新分配,所以不需要以後再刪除一列。

Col1 Col2 Col3 Col4 Col5 
0 AA  AN  log1 Ind  0.9 
1 AB  LN  log2 RED  8.9 
2 AAC  RN  log3 RED  9.8 
1

使用正則表達式從the great @piRSquared's solution

In [59]: regex = '(?P<Col2>.*)\|{2,}(?P<Col4>.*)\((?P<Col5>.*)\)' 

In [60]: mydf = mydf.join(mydf.pop('Col2').str.extract(regex, expand=True)) \ 
        .sort_index(axis=1) 

In [61]: mydf 
Out[61]: 
    Col1 Col2 Col3 Col4 Col5 
0 AA AN log1 Ind 0.9 
1 AB LN log2 RED 8.9 
2 AAC RN log3 RED 9.8 
+0

有這麼'pop'再次:-) – piRSquared

+0

@piRSquared,我們對此深感抱歉! 8-D – MaxU

+0

但你的字典更優雅!!! – MaxU