我有一个文件.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 并删除组后的标签?
编辑: 已更新以获得正确的产出
这是我想出的办法。
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中了。
df['data'] = df['data'].str.split('-')
df['tag'] = [x[0] for x in df['data']]
df['tail'] = [x[1] for x in df['data']]
那么现在你有一列是原始数据 一列是标签 一列是尾部字符
现在你可以按标签进行分组。
grouped = df.groupby('tag')
从这里你可以用lambda函数实现你想要的东西。
out = grouped.agg({'tail': lambda t: ''.join(t)})
从这里你可以重置索引,用破折号连接成一个单一的字符串,不管你想要什么。