我对python很陌生。我想映射到最新版本。如果Software_Version列中有两个版本,则始终需要选择第二个版本,即最新版本。
Sofware_Component Software_Version
Python 2.7
Python 2.7,3.6
R 3.5.0,3.6.0
R 3.5.0
替换最新版本的代码:
result4.loc[result4['COMPONENT_VERSION'].str.contains(',')] = result4['COMPONENT_VERSION'].str.split(',').str[-1]
ERROR:ValueError: cannot index with vector containing NA / NaN values
代码正常运行
result4['Software_Componenet'] = result4['SOFTWARE_COMPONENT'].map(str)+' '+result4['COMPONENT_VERSION'].map(str)
我期望结果如下
Software_Component
Python 2.7
Python 3.6
R 3.6.0
R 3.5.0
答案 0 :(得分:1)
在this thread上扩展,您可以在列表理解范围内从distutils.version.LooseVersion
反复调用max
:
from distutils.version import LooseVersion
[max(vers.split(','), key=LooseVersion) for vers in df['Software_Version']]
# ['2.7', '3.6', '3.6.0', '3.5.0']
df['Software_Version'] = [
max(vers.split(','), key=LooseVersion) for vers in df['Software_Version']
]
df
Sofware_Component Software_Version
0 Python 2.7
1 Python 3.6
2 R 3.6.0
3 R 3.5.0
如果您想使用更泛泛的版本(尽管会慢一些),则可以split
和apply
:
df['Software_Version'].str.split(',').apply(max, key=LooseVersion)
0 2.7
1 3.6
2 3.6.0
3 3.5.0
Name: Software_Version, dtype: object
要将它们连接到一个列中,请使用agg
:
df.agg(' '.join, axis=1)
0 Python 2.7
1 Python 3.6
2 R 3.6.0
3 R 3.5.0
dtype: object