Leg*_*ack 4 python dataframe python-3.x pandas
如果数据是无序的,我找不到一种简单的方法来获取在一个数据帧中找到的数据帧的所有行,而不是在第二个数据帧中找到的所有行。
这两个答案谈话是有序数据的解决方案:
在上面提到的一个相关问题中,我找到了一个多索引解决方案,据说可以处理无序数据,但我无法实现它。我希望有一个更简单的方法。
让我给你一个我正在处理的数据的例子:
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
... ...
Run Code Online (Sandbox Code Playgroud)
现在,如果这是两个数据帧中的所有数据,那么专门为 DF1 处理的结果将如下所示:
DF1_UNIQUE
col_a col_b
1325 foo
1645 foo
Run Code Online (Sandbox Code Playgroud)
(所以我真的只关心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])
Run Code Online (Sandbox Code Playgroud)
是的,您可以使用带有indicator参数的合并:
我重命名了列以避免重复列您也可以通过left_on和right_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
Run Code Online (Sandbox Code Playgroud)
现在,您可以merged使用指标列进行过滤:
merged[merged['_merge']=='left_only']
Out:
col_a col_b _merge
0 1325 foo left_only
2 1645 foo left_only
Run Code Online (Sandbox Code Playgroud)