сравнение и приведение к одному шаблону двух файлов .txt
Как в питоне можно сравнить два файла и дописать недостающие строки?
Пример. Содержание файлов:
filetxt1
Bob:20
Bob:22
Bob:23
Tom:20
Tom:23
Tom:40
Tom:19
Albert:21
Albert:22
Albert:31
Albert:24
Mark:19
Mark:22
Mark:11
filetxt2
Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Albert:10
Albert:90
Albert:67
Mark:77
Мне нужно сравнить эти два файла, и во втором файле дописать например 'Tom' два раза, и добавить значение, которое идет после последнего Tom, в данном случае 32, на выходе должно получиться следующее содержание:
Output
Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Tom:32
Tom:32
Albert:10
Albert:90
Albert:67
Albert:67
Mark:77
Mark:77
Mark:77
Как можно дописать между строк, чтобы порядок сохранялся? Пытался сравнивать построчно, но не пойму, как можно дописать, недостающее имя со значением предыдущего имени.
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Воспользуйтесь модулем Pandas:
import pandas as pd # pip install pandas
df1 = pd.read_csv("f1.txt", sep=":", header=None, names=["name", "val"])
df2 = pd.read_csv("f2.txt", sep=":", header=None, names=["name", "val"])
res = (df2
.assign(x=df2.groupby("name").cumcount())
.merge(df1[["name"]].assign(x=df1.groupby("name").cumcount()),
how="right")
.ffill()
.drop(columns="x")
.astype({"val":"int"}))
res.to_csv("result.csv", sep=":", index=False, header=False)
результат:
Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Tom:32
Tom:32
Albert:10
Albert:90
Albert:67
Albert:67
Mark:77
Mark:77
Mark:77
Автор решения: strawdog
→ Ссылка
Вот такой вариант еще:
import pandas as pd
df1 = pd.read_csv("file1.txt", sep=":", header=None)
df2 = pd.read_csv("file2.txt", sep=":", header=None)
tmp = pd.DataFrame()
for i, g in df2.groupby(0, sort=False):
g = g.append([(g.iloc[[-1]]) for x in range(len(df1.loc[df1[0]==i]) - len(g))])
tmp = tmp.append(g)
tmp:
0 1
0 Bob 30
1 Bob 32
2 Bob 40
3 Tom 11
4 Tom 32
4 Tom 32
4 Tom 32
5 Albert 10
6 Albert 90
7 Albert 67
7 Albert 67
8 Mark 77
8 Mark 77
8 Mark 77
ну и для записи результата в файл:
tmp.to_csv("res.txt", sep=":", index=False, header=False)