python: 在文本数据中,如果下一行与上一行的匹配模式相同,则将下一行与上一行进行分组(合并)。

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

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

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
.
.

我想要的输出是:

AAA-1
XX-a
AB-a;b;c
numb-a
lime-a;b
XX-b
AB-d;e
lime-c
AAA-2
.
.
.
AAA-n
.
.

我试过了

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

输出。

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 并删除组后的标签?

python dataframe text nltk
1个回答
0
投票

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

这是我想出的办法。

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

输出。

enter image description here

我想到的第一种方法是把尾部的字符从标签中分离出来,然后放在一个单独的列中。假设你使用的是Pandas,而且它已经在DF中了。

df['data'] = df['data'].str.split('-')
df['tag'] = [x[0] for x in df['data']]
df['tail'] = [x[1] for x in df['data']]

那么现在你有一列是原始数据 一列是标签 一列是尾部字符

enter image description here

现在你可以按标签进行分组。

grouped = df.groupby('tag')

从这里你可以用lambda函数实现你想要的东西。

out = grouped.agg({'tail': lambda t: ''.join(t)})

enter image description here

从这里你可以重置索引,用破折号连接成一个单一的字符串,不管你想要什么。

© www.soinside.com 2019 - 2024. All rights reserved.