使用 Pandas 合并两个具有重复项的文件会重复第一个文件的第一行

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

我有两个 csv 文件,我想对其进行条件连接。第如下:

File path;Song title;Artist names;Album title;Track number;Duration seconds
"Inverno.mp3";"Inverno";"Unknown";"Unknown";"0";280
"Inverno(1).mp3";"Inverno(1)";"Unknown";"Unknown";"0";280
"Soldier, Soldier.mp3";"Soldier, Soldier";"Natalie Merchant";"The House Carpenter's Daughter";"06";225
"Surely.mp3";"Surely";"Unknown";"Unknown";"0";31
"Intro.mp3";"Intro";"intro";"TEJO Beat";"01";30

有17543行+标题

第二个缺少文件路径,但第一个缺少信息:

Song title,Album title,Artist names,Duration seconds Inverno,Perfil,Adriana Calcanhotto,280 Inverno,Fabrica Do Poema,Adriana Calcanhotto,280 "Soldier, Soldier",The House Carpenter's Daughter,Natalie Merchant,225 Surely,Supertramp,Supertramp,31 Intro,TEJO Beat,intro,30
这个有 17560 + 标题

这些文件应该描述 17543 个 mp3 文件和 5 个 m4a 文件。

first 有文件名,但有几个文件带有“未知”字段。 第二有所有标签,但没有文件名。 正确识别文件的唯一方法是组合“歌曲标题”和“持续时间秒”字段,但仍然有一些重复项。

我想要一个 csv 文件,其中包含具有“未知”字段的文件的所有信息。

我将以下内容与 pandas 一起使用来生成合并文件:

keycol = ["Song title", "Duration seconds"] include_values = ["Unknown"] first = pandas.read_csv(firstfile,sep=None,engine='python') second = pandas.read_csv(secondfile,sep=None,engine='python') merged = first.merge(second, on=keycol) mergedfiltered = merged[merged[['Album title_x', 'Artist names_x']].isin(include_values).all(axis=1)] header = ["File path","Song title","Artist names","Album title","Track number","Duration seconds"] column_list = ["File path", "Song title", "Artist names_y","Album title_y","Track number", "Duration seconds"] mergedfiltered.to_csv(destination,index=False, sep=";",columns=column_list, header=header)
这里的问题是,如果有两个文件具有重复的歌曲标题,例如 Inverno.mp3 和 Inverno(1).mp3 并且具有相同的持续时间(相同的曲目和艺术家,不同的专辑 - 通常),则最终文件而不是在一行上有 

"Inverno.mp3;Inverno;Adriana Calcanhotto;Perfil;0;280""Inverno(1).mp3;Inverno;Adriana Calcanhotto;Fabrica Do Poema;0;280",则改为第二行具有相同的文件名和不同的标签 - "Inverno.mp3;Fabrica Do Poema;Adriana Calcanhotto;album2;0;280"

File path;Song title;Artist names;Album title;Track number;Duration seconds "Inverno.mp3";"Inverno";"Perfil";"Adriana Calcanhotto";"0";280 "Inverno.mp3";"Inverno";"Fabrica Do Poema";"Adriana Calcanhotto";"0";280 "Soldier, Soldier.mp3";"Soldier, Soldier";"Natalie Merchant";"The House Carpenter's Daughter";"06";225 "Surely.mp3";"Surely";"Supertramp";"Supertramp";"0";31 "Intro.mp3";"Intro";"intro";"TEJO Beat";"01";30
如何确保 pandas.merge 也使用第二个文件名,也就是说,当它更改第二个文件上的行时,它也会在第一个文件上更改,而不是重复第一个文件的第一行/列?

python pandas merge export-to-csv mp3
1个回答
0
投票
在我看来,你无法做到你所要求的。

让我们以您提供的例子为例。在第一个文件中,您有“Inverno”和“Inverno(1)”,作者/专辑未知。在第二个文件中,您有“Inverno”和“Inverno”,其持续时间相同,作者/专辑已知(和不同)。计算机如何知道从第二个文件中选择哪一行?它根本没有信息来知道应该应用哪些标签。在您的情况下,它实际上与文件持续时间匹配,因此标题不会被保留。

您的框架具有可以唯一匹配的数据(那么您使用

merge

 的方法将起作用),或者您的框架具有与相同文件对应的行(然后您可以直接替换数据,如下所示)。

df1.loc[df1['Artist names'] == 'Unknown', 'Artist names'] = df2.loc[df1['Artist names'] == 'Unknown', 'Artist names'] df1.loc[df1['Album title'] == 'Unknown', 'Album title'] = df2.loc[df1['Album title'] == 'Unknown', 'Album title']
    
© www.soinside.com 2019 - 2024. All rights reserved.