python - Pandas 获取一个数据框中列出的所有行,但不是另一个未排序的行

标签 python python-3.x pandas dataframe

如果数据是无序的,我找不到一种简单的方法来获取在一个数据框中找到但在第二个数据框中找不到的数据框的所有行。

这两个答案讲的是有序数据的解决方案:

Get rows that are present in one dataframe, but not the other

pandas get rows which are NOT in other dataframe

因此,为了清楚起见,我正在努力做到这一点: data from one dataframe thats not found in the other dataframe

在上面提到的一个相关问题中,我发现了一个多索引解决方案,据说可以处理无序数据,但我无法实现它。我希望有更简单的方法。

让我举一个我正在处理的数据的例子:

DF1
col_a   col_b
1325    foo
1397    foo        #<---matching value, but not matching index in DF2
1645    foo
...     ...

DF2
col_1   col_2
1397    foo        #<---matching value, but not matching index in DF1
1500    foo
1621    foo
...     ...

现在,如果这是两个数据框中的所有数据,那么专门为 DF1 处理的结果将如下所示:

DF1_UNIQUE
col_a   col_b
1325    foo
1645    foo

(所以我真的只关心 col_a 或 DF2 col_1)。请注意它缺少 1397 行。那是因为它是在 DF2 中找到的,所以我不希望它返回到我的新 DF 中。但它没有在同一个索引中找到,这就是我遇到的问题。如果所有匹配的索引都对齐,我已经很容易地创建了一个解决方案,但我不知道从哪里开始处理未对齐的索引。我可以使用合并功能吗?还是该工具不适合这项工作?

这段代码并不完全相关,但如果所有索引都正确排列,它就是我想出的解决方案:

def getUniqueEntries(df1, df2):
    """takes two dataframes, returns a dataframe that is comprized of all the rows unique to the first dataframe."""
    d1columns = df1.columns
    d2columns = df2.columns
    df3 = pd.merge(df1, df2, left_on=d1columns[0], right_on=d2columns[0])
    print(df3)
    return df1[(~df1[d1columns[0]].isin(df3[d1columns[0]]))]     

def main(fileread1, fileread2, writeprefix):
    df1 = pd.read_csv(fileread1)
    df2 = pd.read_csv(fileread2)

    df3 = getUniqueEntries(df1, df2)
    df4 = getUniqueEntries(df2, df1)
    
    print(df3)
    print(df4)

    df3.to_csv(writeprefix+fileread1, index=False)
    df4.to_csv(writeprefix+fileread2, index=False)
    
if __name__ == '__main__':
    main(sys.argv[1], sys.argv[2], sys.argv[3])

最佳答案

是的,您可以将合并与 indicator 参数结合使用:

我重命名了列以避免列重复 您还可以通过 left_onright_on

merged = DF1.merge(DF2.rename(columns={'col_1': 'col_a', 'col_2': 'col_b'}), how='left', indicator=True)
merged
Out: 
   col_a col_b     _merge
0   1325   foo  left_only
1   1397   foo       both
2   1645   foo  left_only

现在,您可以使用指标列过滤 merged:

merged[merged['_merge']=='left_only']
Out: 
   col_a col_b     _merge
0   1325   foo  left_only
2   1645   foo  left_only

关于python - Pandas 获取一个数据框中列出的所有行,但不是另一个未排序的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39237642/

相关文章:

Python 到 C++ 的字典列表

python - 如何使用 Pandas 搜索和识别 csv 文件中的浮点值?

Python Bokeh : Set line color based on column in columndatasource

python - Numpy:沿轴应用具有不同索引的输入数组

python - 从 python3 启动应用程序然后继续其他代码

python - 设置元素的同一列表的所有元素之间的交集

python-3.x - 从字符串生成用于加密的整数,反之亦然

python - 在python3中将hsl转换为十六进制

css - Python3 Selenium清除表格中的文本框

python - 用不完整的数据填充 Pandas DataFrame