首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在熊猫中拆分和转换字符串列

在熊猫中拆分和转换字符串列
EN

Stack Overflow用户
提问于 2018-03-01 10:08:37
回答 2查看 1.4K关注 0票数 3

我正在处理一个软件的输出,该软件在一列中以x、y、z三重坐标的形式提供协调。有没有办法把绳子分成三个独立的部分,然后一下子转换成浮子呢?例如,我知道我可以做以下工作:

代码语言:javascript
复制
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

分离出这三个字符串,但尝试例如

代码语言:javascript
复制
df['COORDFRONT'].str.split(' ').astype(float)

返回一个ValueError

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 10:10:30

splitexpand=True一起用于DataFrame,并通过双[]为子集中的新列分配

代码语言:javascript
复制
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

代码语言:javascript
复制
L = [x.split() for x in df['COORDFRONT'].values.tolist()]
df[['Front_x', 'Front_y', 'Front_z']] = pd.DataFrame(L).astype(float)
票数 4
EN

Stack Overflow用户

发布于 2018-03-01 10:12:46

这是一种方法:

代码语言:javascript
复制
df['Front_x'], df['Front_y'], df['Front_z'] = list(zip(*[list(map(float, i)) for i in \
                                                   df['COORDFRONT'].str.split(' ')]))

结果

代码语言:javascript
复制
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。以下是一些基准结果。

代码语言:javascript
复制
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)  # 127ms
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49047244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档