如何组合DataFame列数据和固定文本字符串

问题描述 投票:1回答:3

我想在一个更大的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 )
python pandas dataframe concatenation
3个回答
2
投票

您的功能已经看起来不错,只需要添加一些内容:

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])

0
投票

以这种方式使用

df['new']='LINESTRING'
df['WKT']=pd.concat([df['new'],df['SOLE'],df['SOLN'],df['EOLE'],df['EOLN']])

0
投票

您还可以创建要导出的列的集合,进行快速的数据类型格式化,并应用联接。

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 ...
© www.soinside.com 2019 - 2024. All rights reserved.