我找不到一个简单的方法来获取一个数据帧中的所有行,而不是第二个数据帧中的所有行(如果数据是无序的)。在
这两个答案是有序数据的解决方案:
Get rows that are present in one dataframe, but not the other
在上面提到的一个相关问题中,我发现了一个多索引解决方案,它应该可以处理无序数据,但我无法实现它。我希望有更简单的方法。在
我给你举一个我正在处理的数据的例子:
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处理此数据的结果如下所示:
^{pr2}$(所以我只关心col_a
或DF2col_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])
这使用布尔索引来定位} 来定位匹配的行,并使用反运算符(
df1
中的所有行,其中col_a
中的值不在df2
的col_a
中(~
)。它使用^{~
)来查找与这些行相反的行(即不匹配的行)。在您提到了一个索引,但是您的示例数据没有索引。因此,根据您的示例,匹配只在
col_a
中的值上进行。在下面是一个与SQL(Oracle)减号操作等效的pandas:
熊猫:
^{pr2}$说明:
是的,您可以将merge与
indicator
参数一起使用:我重命名了列以避免重复的列,您还可以传递}
left_on
和{现在,您可以使用指示符列过滤
^{pr2}$merged
:相关问题 更多 >
编程相关推荐