python - Dataframe.isin 对我不起作用,即使有相交的行也返回相同的行数
问题描述
我在另一个数据集的 for 循环中应用内部联接,现在我只需要删除已经是内部联接一部分的行,所以我使用 Dataframe.isin(another_df) 但它没有给我预期的结果。我检查了列名和它们的数据类型,它们都是一样的。有人可以帮我吗?
在下面的代码中,isin 是我在两个数据帧之间检查的地方,但我仍然没有得到任何响应,即使它们具有相同的行数和列数,我也会得到相同的行集。注意:我在 isin 函数中删除了一个额外的列,因为它是其中一个数据帧中存在的额外列。我的代码如下所示:
df = pd.DataFrame(columns= override.columns)
for i in list1:
join_value = tuple(i)
i.append('creditor_tier_interim')
subset_df = override.merge(criteria[i].dropna(), on = list(join_value), how = 'inner')
subset_df['PRE_CHARGEOFF_FLAG'] = pd.to_numeric(subset_df.PRE_CHARGEOFF_FLAG)
override=override[~override.isin(subset_df.drop(columns = 'creditor_tier_interim'))].dropna(how = 'all')
print('The override shape would be:', override.shape)
df = df.append(subset_df)
df = df.append(override)
解决方案
听起来好像您有“左”和“右”数据框,并且您正在寻找那些仅在其中一个或另一个中的记录。下面返回仅在右侧或左侧 DataFrame 中的行。
import pandas as pd
import numpy as np
from pandas import DataFrame, Series
dataframe_left = DataFrame(np.random.randn(25).reshape(5,5),columns=['A','B','C','D','E'],index=np.arange(5))
dataframe_right = DataFrame(np.random.randn(25).reshape(5,5),columns=['A','B','C','D','E'],index=np.arange(5))
insert_left = DataFrame(np.arange(5).reshape(1,5),columns=['A','B','C','D','E'],index=[7])
insert_right = DataFrame(np.arange(5).reshape(1,5),columns=['A','B','C','D','E'], index=[6])
dataframe_right = dataframe_right.append(insert_right)
dataframe_left = dataframe_left.append(insert_left)
上面的代码产生这个输出
左表
一个 | 乙 | C | D | 乙 | |
---|---|---|---|---|---|
0 | -0.3240086903973736 | 1.0441549453943946 | -0.23640436950107843 | 0.5466767470739027 | -0.2123693649877372 |
1 | -0.04263388410830733 | -0.4855492977594353 | -1.5584284407735072 | 1.2438524586306603 | -0.31087239909921277 |
2 | 0.6982581750529829 | -0.42379154444215905 | 1.1625089013522614 | -3.378898146269229 | 1.0550121763954057 |
3 | 0.3774337535208665 | 0.6402576096348337 | -0.2787520258645991 | 0.31071767629270125 | 0.34499495360962007 |
4 | -0.133649590435452 | 0.3679768579635411 | -2.0196709364730014 | 1.2860033685128436 | -0.49674737879741193 |
7 | 0.0 | 1.0 | 2.0 | 3.0 | 4.0 |
右表
一个 | 乙 | C | D | 乙 | |
---|---|---|---|---|---|
0 | -0.09946693056759418 | -0.03378933704588447 | -0.4117873368048701 | 0.21976489856531914 | -0.7020527418892488 |
1 | -2.9936183481793233 | 0.42443360961021837 | -0.1681576564885903 | -0.5080538565354785 | -0.29483296271514153 |
2 | -0.6567306172004121 | -1.221239625798079 | -1.2604670988941196 | 0.44472543746187265 | -0.4562966381137614 |
3 | -0.0027697712245823482 | 0.1323767897141191 | -0.11073953230359104 | -0.3596157927825233 | 1.9894525572891626 |
4 | 0.5170901011452596 | -1.1694605240821456 | 0.29238712582282705 | -0.38912521589557797 | -0.8793074660039492 |
6 | 0.0 | 1.0 | 2.0 | 3.0 | 4.0 |
设置好测试数据框后,我们可以加入两者并过滤我们感兴趣的行:
tmp = pd.merge(
left=dataframe_left,
right=dataframe_right,
right_index=True,
left_index=True,
how='outer',
suffixes=['_left','_right'],
indicator=True
)
tmp[tmp._merge.isin(['right_only','left_only'])]
这会产生以下结果
A_left | B_left | C_left | D_left | E_left | A_right | 明亮的 | C_right | D_right | E_right | _合并 | |
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 0.0 | 1.0 | 2.0 | 3.0 | 4.0 | right_only | |||||
7 | 0.0 | 1.0 | 2.0 | 3.0 | 4.0 | left_only |
推荐阅读
- css - Vue中的过渡元素
- javascript - 不能用作 JSX 组件。它的返回类型“void”不是有效的 JSX element.ts(2786)
- java - 如何从同一生产者向不同的 Kafka 主题和模式注册表生成消息
- docker - Docker 只识别相对目录,不识别绝对目录
- vb.net - 覆盖参数 [ 和 ] 之间的文本文件
- tailwind-css - 从设计系统导出的 tailwind.dist.css 导致主项目中的 css 重复
- node.js - 如何使用 Joi 验证十进制数字的精度
- fetch - 通过 Office Scripts Fetch 调用 API 时出现 CORS 问题
- file - 如何从文件中删除短行文本
- sql - SQL 基于一列去重