首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:如果下一行以文本数据中相同的匹配模式开始,则将下一行与前一行合并

python:如果下一行以文本数据中相同的匹配模式开始,则将下一行与前一行合并
EN

Stack Overflow用户
提问于 2020-05-13 19:06:43
回答 1查看 149关注 0票数 0

我有一个非常大的数据组(AAA-(n))的file.txt。文件中的许多行都有相同的标记(例如。AB)在文件中的AAA -(n)到AAA-(n+1)行之间。我想把它们放在一条线上。例如:

代码语言:javascript
复制
AAA-1
XX-a
AB-a
AB-b
AB-c
numb-a
lime-a
lime-b
XX-b
AB-d
AB-e
lime-c
AAA-2
.
.
AAA-n
.
.

我想要的输出是:

代码语言:javascript
复制
AAA-1
XX-a
AB-a;b;c
numb-a
lime-a;b
XX-b
AB-d;e
lime-c
AAA-2
.
.
.
AAA-n
.
.

我试过这个:

代码语言:javascript
复制
from itertools import groupby, count

counter = count()
with open('file.txt') as f:
    for key, group in groupby(f, lambda s: next(counter) if s.startswith('AAA') or s.startswith('XX') else -1):
        print(';'.join(s.rstrip('\n') for s in group))

退出:

代码语言:javascript
复制
AAA-1
XX-a
AB-a;AB-b;AB-c;numb-a;lime-a;lime-b
XX-b
AB-d;AB-e;lime-c
AAA-2

请帮助我避免使用AB对其他标签进行分组,并在分组后删除标记?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 19:29:40

编辑:更新以获得正确的输出

以下是我想出的:

代码语言:javascript
复制
df = pd.DataFrame.from_dict({'data': dat})
df['data'] = df['data'].str.split('-')
df['tag'] = [x[0] for x in df['data']]
df['tail'] = [x[1] for x in df['data']]

i = 0
while i < (len(df) - 1): 
    tails = [df.iat[i, 2]]
    j = 1
    while(df.iat[i, 1] == df.iat[i+j, 1]):
        tails.append(df.iat[i+j, 2])
        j += 1
    df.loc[i, 'tails'] = tails
    i += j

df.dropna(how='any', axis=0, inplace=True)
df.reset_index(drop=True, inplace=True)
df.drop(columns=['data', 'tail'], inplace=True)
df['final'] = [df.at[i, 'tag'] + '-' + ';'.join(df.at[i, 'tails']) for i in range(len(df))]

输出:

想到的第一种方法是将尾随字符从标记中分离出来,并放置在单独的列中。假设您使用的是Pandas,并且它已经在DF中:

代码语言:javascript
复制
df['data'] = df['data'].str.split('-')
df['tag'] = [x[0] for x in df['data']]
df['tail'] = [x[1] for x in df['data']]

现在,您有一个包含原始数据的列,一个带有标记的列,还有一个带有尾的列。

现在,您可以按标记进行分组:

代码语言:javascript
复制
grouped = df.groupby('tag')

从这里开始,您可以使用lambda函数实现您想要的结果:

代码语言:javascript
复制
out = grouped.agg({'tail': lambda t: ''.join(t)})

从这里开始,您可以重置索引,用破折号连接到一个字符串中,不管您想要什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61782906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档