我想在一个更大的DataFrame中将4列与一个自定义(空格)定界符(我在下面的代码中完成)组合在一起,但是然后我想在每个串联的开始和结束处添加一个固定的字符串。这些列是X和Y坐标对,但是为此可以将它们当作str处理(一旦我将其修整到3个小数位)。
我在这个网站上找到了许多用于连接列的选项,但是没有一个用于连接列和一致的固定字符串的方法。懒惰的方法是对我来说,再创建两个DataFrame列,一个用于开始,一个用于结束,并照顾一切。有没有更复杂的方法?
import pandas as pd
from pandas import DataFrame
import numpy as np
def str_join(df, sep, *cols):
from functools import reduce
return reduce (lambda x,y: x.astype(str).str.cat(y.astype(str), sep=sep),
[df[col] for col in cols])
data= pd.read_csv('/Users/XXXXXX/Desktop/Lines.csv')
df=pd.DataFrame(data, columns=['Name','SOLE','SOLN','EOLE','EOLN','EOLKP','Wind','Wave'])
df['SOLE']=round(df['SOLE'],3)
df['SOLN']=round(df['SOLN'],3)
df['EOLE']=round(df['EOLE'],3)
df['EOLN']=round(df['EOLN'],3)
df['WKT']=str_join(df,' ','SOLE','SOLN','EOLE','EOLN')
df.to_csv('OutLine.csv') #turn on to create output file
给我。
WKT
476912.131 6670122.285 470329.949 6676260.271
我想做的是在每个串联的开头添加'(LINESTRING',并在每个结尾添加')'给我。
WKT
(LINESTRING 476912.131 6670122.285 470329.949 6676260.271 )
您的功能已经看起来不错,只需要添加一些内容:
def str_join(df, sep, *cols):
# All cols must be numeric to use df[col].round(3)
from functools import reduce
return reduce (lambda x,y: 'LINESTRING ' + x.astype(str).str.cat(y.astype(str) + ' )', sep=sep),
[df[col].round(3) for col in cols])
以这种方式使用
df['new']='LINESTRING'
df['WKT']=pd.concat([df['new'],df['SOLE'],df['SOLN'],df['EOLE'],df['EOLN']])
您还可以创建要导出的列的集合,进行快速的数据类型格式化,并应用联接。
target_cols = ['SOLE','SOLN','EOLE','EOLN',]
df[target_cols] = df[target_cols].astype(str)
# Make sure to use along axis 1
df['WKT'] = df[target_cols].apply(lambda x: '(LINESTRING ' + ' '.join(x.values) + ')', axis=1)
结果:
In [0]: df.iloc[:,-3:]
Out [0]:
Wind Wave WKT
0 wind1 wave1 (LINESTRING 476912.131 6670122.285 470329.949 ...