我正在处理一个软件的输出,该软件在一列中以x、y、z三重坐标的形式提供协调。有没有办法把绳子分成三个独立的部分,然后一下子转换成浮子呢?例如,我知道我可以做以下工作:
import pandas as pd
df = pd.DataFrame({'ID': {0: 3864, 1: 3864, 2: 3864, 3: 3864, 4: 3864},
'COORDFRONT': {0: '787.547 238.639 0.000', 1: '787.141 238.847 0.000', 2: '786.729 239.057 0.000', 3: '786.310 239.271 0.000', 4: '785.886 239.488 0.000'},
'COORDREAR': {0: '803.545 230.467 0.000', 1: '803.139 230.675 0.000', 2: '802.727 230.885 0.000', 3: '802.309 231.099 0.000', 4: '801.884 231.316 0.000'}})
df['Front_x'], df['Front_y'], df['Front_z'] = df['COORDFRONT'].str.split(' ').str分离出这三个字符串,但尝试例如
df['COORDFRONT'].str.split(' ').astype(float)返回一个ValueError。
发布于 2018-03-01 10:10:30
将split与expand=True一起用于DataFrame,并通过双[]为子集中的新列分配
df[['Front_x', 'Front_y', 'Front_z']] = df['COORDFRONT'].str.split(expand=True).astype(float)
print (df)
COORDFRONT COORDREAR ID Front_x Front_y \
0 787.547 238.639 0.000 803.545 230.467 0.000 3864 787.547 238.639
1 787.141 238.847 0.000 803.139 230.675 0.000 3864 787.141 238.847
2 786.729 239.057 0.000 802.727 230.885 0.000 3864 786.729 239.057
3 786.310 239.271 0.000 802.309 231.099 0.000 3864 786.310 239.271
4 785.886 239.488 0.000 801.884 231.316 0.000 3864 785.886 239.488
Front_z
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0 如果列中没有NaN的值是可能的,使用list comprehension
L = [x.split() for x in df['COORDFRONT'].values.tolist()]
df[['Front_x', 'Front_y', 'Front_z']] = pd.DataFrame(L).astype(float)发布于 2018-03-01 10:12:46
这是一种方法:
df['Front_x'], df['Front_y'], df['Front_z'] = list(zip(*[list(map(float, i)) for i in \
df['COORDFRONT'].str.split(' ')]))结果
df.dtypes
# COORDFRONT object
# COORDREAR object
# ID int64
# Front_x float64
# Front_y float64
# Front_z float64
# dtype: object解释
map结果中传递给float。zip(*...),以便输出为3系列分配所需的3个数组。性能
要在大型数据格式上获得更好的性能,请使用@jezrael's solution。以下是一些基准结果。
df = pd.DataFrame({'ID': {0: 3864, 1: 3864, 2: 3864, 3: 3864, 4: 3864},
'COORDFRONT': {0: '787.547 238.639 0.000', 1: '787.141 238.847 0.000', 2: '786.729 239.057 0.000', 3: '786.310 239.271 0.000', 4: '785.886 239.488 0.000'},
'COORDREAR': {0: '803.545 230.467 0.000', 1: '803.139 230.675 0.000', 2: '802.727 230.885 0.000', 3: '802.309 231.099 0.000', 4: '801.884 231.316 0.000'}})
def jp(df):
df['Front_x'], df['Front_y'], df['Front_z'] = list(zip(*[list(map(float, i)) for i in df['COORDFRONT'].str.split(' ')]))
return df
def jez(df):
df[['Front_x', 'Front_y', 'Front_z']] = df['COORDFRONT'].str.split(expand=True).astype(float)
return df
# df = pd.concat([df]*100)
%timeit jp(df) # 2.2ms
%timeit jez(df) # 2.94ms
# df = pd.concat([df]*10000
%timeit jp(df) # 154ms
%timeit jez(df) # 127mshttps://stackoverflow.com/questions/49047244
复制相似问题