比较两个数据帧(源与目标),如果在目标表中未找到记录(与源具有相同的索引号),则留空行

时间:2019-06-13 08:14:06

标签: python pandas numpy

要比较dfs“源”中存在的数据与“索引”号 针对dfs“目标”,如果在目标dfs中找不到搜索到的索引,则必须使用与源中给定的相同索引键在目标表中打印空白行。还有其他没有循环的方法,因为我需要比较500,000条记录的数据集。

以下是源,目标和预期数据帧。源数据的索引号为3的记录,而目标数据没有索引号为3的记录。

我想用与源相同的索引号打印空白行。

来源:

Index   Employee ID Employee Name   Age     City    Country
1   5678    John    30  New york    USA
2   5679    Sam 35  New york    USA
3   5680    Johy    25  New york    USA
4   5681    Rose    70  New york    USA
5   5682    Tom 28  New york    USA
6   5683    Nick    49  New york    USA
7   5684    Ricky   20  Syney   Australia

目标:

Index   Employee ID Employee Name   Age     City    Country
1   5678    John    30  New york    USA
2   5679    Sam 35  New york    USA
4   5681    Rose    70  New york    USA
5   5682    Tom 28  New york    USA
6   5683    Nick    49  New york    USA
7   5684    Ricky   20  Syney   Australia

预期:

Index   Employee ID Employee Name   Age     City    Country
1   5678    John    30  New york    USA
2   5679    Sam 35  New york    USA
3                   
4   5681    Rose    70  New york    USA
5   5682    Tom 28  New york    USA
6   5683    Nick    49  New york    USA
7   5684    Ricky   20  Syney   Australia

请建议是否有任何方法可以做到不循环,因为我需要比较500,000条记录的数据集。

2 个答案:

答案 0 :(得分:1)

您可以reindexfillna()加上''空格:

Target.reindex(Source.index).fillna('')

或者:

Target.reindex(Source.index,fill_value='')

如果Index是一列而不是实际上不是索引,请将其设置为索引:

Source=Source.set_index('Index')
Target=Target.set_index('Index')

答案 1 :(得分:0)

不是最好的方法,我更喜欢@ anky_91的方法:

>>> df = pd.concat([source, target]).drop_duplicates(keep='first')
>>> df.loc[~df['Index'].isin(source['Index']) | ~df['Index'].isin(target['Index']), df.columns.drop('Index')] = ''
>>> df
   Index Employee ID Employee Name       Age      City    Country
0      1        5678          John        30  New york        USA
1      2        5679        Sam 35  New york       USA       None
2      3                                                         
3      4        5681          Rose        70  New york        USA
4      5        5682        Tom 28  New york       USA       None
5      6        5683          Nick        49  New york        USA
6      7        5684         Ricky        20     Syney  Australia
>>>