如何通过Pandas(Python 3.x)中的第一个和最后一个找到的模式将一列分为两列

时间:2018-11-16 11:26:44

标签: python string pandas dataframe split

我将一列分为两列时遇到问题。我想按第一个和最后一个找到的模式'-'拆分该列。也许这很简单。

这是我的专栏:

        col1
0       aa-bb-cc-dd
1       aa-bb-cc
2       aa-bb-cc
3       aa-bb-cc-dd

这是我要作为结果的帧:

        col1           col2
0       bb-cc          dd
1       bb             cc
2       bb             cc
3       bb-cc          dd

谢谢!

5 个答案:

答案 0 :(得分:3)

您可以使用列表理解:

df = pd.DataFrame([i.split('-', 1)[1].rsplit('-', 1) for i in df['col1']],
                  columns=['col1', 'col2'])

print(df)

    col1 col2
0  bb-cc   dd
1     bb   cc
2     bb   cc
3  bb-cc   dd

Pandas str方法主要是为了方便起见。对于干净的数据,您可能会发现列表理解对于较大的数据框更有效。

答案 1 :(得分:1)

如果我很了解您的问题,那么您需要删除以'-'分隔的第一个块,然后在col2中拆分最后一个'-'块。如果那是您需要的,可以考虑一下:

df= pd.DataFrame({'col1':['aa-bb-cc-dd', 'aa-bb-cc', 'aa-bb-cc', 'aa-bb-cc-dd']})
df['col2'] = df['col1'].apply(lambda x: x[x.rfind('-')+1:])
df['col1'] =  df['col1'].apply(lambda x: x[x.find('-')+1:x.rfind('-')])
print (df)

答案 2 :(得分:1)

第一个切片,并使用str.rsplitrename

 <?xml version="1.0" encoding="UTF-8"?>
 <wls:weblogic-web-app
    xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
    http://xmlns.oracle.com/weblogic/weblogic-web-app 
    http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd">
    <wls:context-root>WISE.BI.AUDI.WEB.SVC.v5</wls:context-root>
        <wls:jsp-descriptor>
        <wls:encoding>UTF-8</wls:encoding>
    </wls:jsp-descriptor>
    <wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>com.ctc.wstx.*</wls:package-name>
        <wls:package-name>javax.wsdl.*</wls:package-name>
        <wls:package-name>org.apache.cxf.*</wls:package-name>
    <!-- <wls:package-name>javax.jws.*</wls:package-name> -->
    </wls:prefer-application-packages>
</wls:container-descriptor>

答案 3 :(得分:1)

这是一种惯用但缓慢的方法:

df.col1 = df.col1.str.split('-', 1).str[1] # discard first part
parts = df.col1.str.rsplit('-', 1).str
df.col1 = parts[0]
df['col2'] = parts[1]

虽然可行,但速度并不很快:700k行大约需要4秒。纵观它,您会认为这是一种很好的方法,但是从性能角度来看,它比所有其他方法都差。

答案 4 :(得分:-1)

这可能会有所帮助:

df['col2'] = df['col1'].split('-')[-1]
df['col1'] = '-'.join(i for i in df['col1'].split('-')[1:-1])