大熊猫拆分数据帧列

问题描述:

我有以下的数据帧,我想给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. 

您可以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值。

@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 

使用正则表达式从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