Python 熊猫在一个数据帧中列出所有行,但在另一个数据帧中不无序
如果数据无序,我无法找到一种简单的方法来获取一个数据帧中的所有行,而不是第二个数据帧中的所有行 这两个答案是针对有序数据的解决方案: 所以,我想说清楚,我想得到: 在上面提到的一个相关问题中,我发现了一个多索引解决方案,它应该可以处理无序数据,但我无法实现它。我希望有一个更简单的方法 让我举一个我正在处理的数据的例子:Python 熊猫在一个数据帧中列出所有行,但在另一个数据帧中不无序,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,如果数据无序,我无法找到一种简单的方法来获取一个数据帧中的所有行,而不是第二个数据帧中的所有行 这两个答案是针对有序数据的解决方案: 所以,我想说清楚,我想得到: 在上面提到的一个相关问题中,我发现了一个多索引解决方案,它应该可以处理无序数据,但我无法实现它。我希望有一个更简单的方法 让我举一个我正在处理的数据的例子: DF1 col_a col_b 1325 foo 1397 foo #<---matching value, but not match
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
... ...
(所以我只关心colu a
或DF2colu 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\u a
中的值不在df2
的col\u a
中(~
)。它用于定位匹配行,并使用求反运算符(~
)查找与之相反的行(即不匹配的行)
您提到了索引,但示例数据中没有索引。因此,根据您的示例,仅对
列a
中的值进行匹配。以下是SQL(Oracle)减号操作的等效值:
select col1, col2 from tab1
minus
select col1, col2 from tab2
大熊猫:
In [59]: df1[~df1.isin(pd.DataFrame(df2.values, columns=df1.columns).to_dict('l')).all(1)]
Out[59]:
col_a col_b
0 1325 foo
2 1645 foo
说明:
In [60]: pd.DataFrame(df2.values, columns=df1.columns)
Out[60]:
col_a col_b
0 1397 foo
1 1500 foo
2 1621 foo
In [61]: pd.DataFrame(df2.values, columns=df1.columns).to_dict('l')
Out[61]: {'col_a': [1397, 1500, 1621], 'col_b': ['foo', 'foo', 'foo']}
In [62]: df1.isin(pd.DataFrame(df2.values, columns=df1.columns).to_dict('l'))
Out[62]:
col_a col_b
0 False True
1 True True
2 False True
In [63]: df1.isin(pd.DataFrame(df2.values, columns=df1.columns).to_dict('l')).all(1)
Out[63]:
0 False
1 True
2 False
dtype: bool
是的,您可以将merge与
指示器
参数一起使用:
我重命名了这些列以避免重复的列。您还可以在上传递left\u,在
上传递right\u
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
我会尝试一下,但是isin
在两列之间不匹配相同的索引吗?我有这样的印象。我可能实施错了,但这个解决方案不起作用。它返回了整个列表,没有检测到任何匹配项(我相信这是因为所有匹配项都在不同的索引中,正如我所提到的)。您能提供一个更好的数据帧示例吗?e、 g.df1.为了说明('list')
您提到了一个索引,但您的样本没有索引。另外,是否可能在列a
中有相同的值,但在列b
中有不同的值?如果是的话,你想怎么处理呢?很好,我不知道指示器
参数谢谢所有回答的人!这个答案对我来说是最容易理解的,我是熊猫的第一天新成员,再次感谢!
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['_merge']=='left_only']
Out:
col_a col_b _merge
0 1325 foo left_only
2 1645 foo left_only