子串python数据帧的每个元素

时间:2017-11-02 12:06:14

标签: python dataframe substring slice series

考虑列df

的数据框path
/home/dir1/myfile1.txt
/home/anotherDir2/myfile2.txt
/home/anotherDir3/AnotherMyfile3.txt

我想拆分每行的文件夹和文件名部分。

我知道

df.path.str.rfind('/')

为我提供整个系列的最后一个/ 索引。我想将此索引结果分别应用于每一行,但

df.path.str.slice(0, df.path.str.rfind('/'))

返回所有NA。似乎slice期望单个整数参数为endposition而不是系列。

我如何在python中实现这一目标?

1 个答案:

答案 0 :(得分:0)

这是使用的数据框:

import pandas as pd 

df = pd.DataFrame({'path': ['/home/dir1/myfile1.txt', \
                            '/home/anotherDir2/myfile2.txt', \
                            '/home/anotherDir3/AnotherMyfile3.txt']})

您可以使用apply()浏览df行,并提取最后'/'之前的所有内容:

df.path.apply(lambda x: x[0:x.rfind('/')])

返回:

0           /home/dir1
1    /home/anotherDir2
2    /home/anotherDir3
Name: path, dtype: object

类似地,你可以做同样的事情来提取上一个'/'之后的所有内容:

df.path.apply(lambda x: x[(x.rfind('/') + 1):len(x)])

返回:

0           myfile1.txt
1           myfile2.txt
2    AnotherMyfile3.txt
Name: path, dtype: object

如果你想同时获得文件夹和文件,你可以使用这样的函数将字符串拆分为'/'并返回最后2个元素:

def split_path(path):
    folder_file = path.split('/')[-2:]
    return(pd.Series({'folder': folder_file[0], 'file': folder_file[1]}))

然后你可以apply()并将2列添加到你的df:

pd.concat([df, df.path.apply(split_path)], axis=1)

返回:

                                   path                file       folder
0                /home/dir1/myfile1.txt         myfile1.txt         dir1
1         /home/anotherDir2/myfile2.txt         myfile2.txt  anotherDir2
2  /home/anotherDir3/AnotherMyfile3.txt  AnotherMyfile3.txt  anotherDir3