[英]Pandas split a dataframe column
我有以下数据框,我想将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
期望的DataFrame:
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
我从Apply开始,但以下几步将会很快完成。 有什么捷径?
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
使用伟大的@ piRSquared解决方案中的 RegEx
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.