在读取数据帧之前或读取数据帧时拆分字符串

2024-06-02 07:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其中包含用户ID(其中一些出现不止一次)以及注册日期。此外,我还有一些关于字符串中包含的某些路径的信息:

id1, 01-01-2015, 'place0-place01'
id1, 01-01-2015, 'place0-place01-place03'
id1, 01-01-2015, 'place1-place11-place12'
id2, 01-01-2016, 'place0-place01-place03'
id3, 01-01-2017, 'place5-place51-place53'
id3, 01-01-2017, 'place5-place51-place53'

我想把它读入一个数据帧,我需要拆分字符串,这样我只得到字符串的第一部分,在第一个'-'之前。我已尝试使用替换和拆分:

for index, row in df.iterrows():
    df.replace(row['section'], row['section'].split('.')[0], inplace = True)

但由于文件的大小,速度慢得可笑。有人有更好的解决方案吗? 我应该以以下方式结束:

id1, 01-01-2015, 'place0'
id1, 01-01-2015, 'place0'
id1, 01-01-2015, 'place1'
id2, 01-01-2016, 'place0'
id3, 01-01-2017, 'place5'
id3, 01-01-2017, 'place5'

或者每个用户id的每个路径的计数


Tags: 文件字符串用户路径rowid3id2id1
2条回答

您可以使用.strSeries方法。Pandas在处理字符串方面有一个great tutorial

您还可以在^{}中使用converterskwarg

以下是数据集上几种不同方法的计时结果(我重复了很多次):

# 2.78s (Read in everything, split, then take the first result)
%time df = pd.read_csv('tmp.txt', header=None, nrows=1000000); df.loc[:, 2] = df.loc[:, 2].str.split('-').str[0]
# 2.56s (Read in everything and use a regular expression)
%time df = pd.read_csv('tmp.txt', header=None, nrows=1000000); df.loc[:, 2] = df.loc[:, 2].str.extract('([^-]*)')
# 2.58s (Apply a function to the second column when data is read)
%time df = pd.read_csv('tmp.txt', header=None, nrows=1000000, converters={2: lambda x: re.match('[^-]*', x).group(0)})

正如所见,使用两种正则表达式方法(第2种和第3种)中的一种要快一些

您可以尝试以下方法:

df = pd.DataFrame({'col1':['place0-place01','place1-place01-place11']})
df['col2'] = df.col1.str.split('-').str.get(0)

    # output
     col1                    col2
0   place0-place01          place0
1   place1-place01-place11  place1

相关问题 更多 >