大熊猫拆分数据帧列
问题描述:
我有以下的数据帧,我想给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.extract
和assign
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
有这么'pop'再次:-) – piRSquared
@piRSquared,我们对此深感抱歉! 8-D – MaxU
但你的字典更优雅!!! – MaxU