python - pandas - 按行元素通过另一个数据框过滤数据框

标签 python pandas dataframe

我有一个数据框 df1,它看起来像:

   c  k  l
0  A  1  a
1  A  2  b
2  B  2  a
3  C  2  a
4  C  2  d

还有一个叫 df2 像:

   c  l
0  A  b
1  C  a

我想过滤 df1 只保留不在 df2 中的值。要过滤的值应为 (A,b)(C,a) 元组。到目前为止,我尝试应用 isin 方法:

d = df[~(df['l'].isin(dfc['l']) & df['c'].isin(dfc['c']))]

这在我看来太复杂了,它返回:

   c  k  l
2  B  2  a
4  C  2  d

但我期待:

   c  k  l
0  A  1  a
2  B  2  a
4  C  2  d

最佳答案

您可以在从所需列构造的多索引上使用 isin 有效地做到这一点:

df1 = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
                    'k': [1, 2, 2, 2, 2],
                    'l': ['a', 'b', 'a', 'a', 'd']})
df2 = pd.DataFrame({'c': ['A', 'C'],
                    'l': ['b', 'a']})
keys = list(df2.columns.values)
i1 = df1.set_index(keys).index
i2 = df2.set_index(keys).index
df1[~i1.isin(i2)]

enter image description here

我认为这改进了 @IanS 的类似解决方案,因为它不假定任何列类型(即它可以处理数字和字符串)。


(上面的答案是一个编辑。以下是我最初的答案)

有趣!这是我以前没有遇到过的事情......我可能会通过合并两个数组来解决它,然后删除定义 df2 的行。这是一个使用临时数组的示例:

df1 = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
                    'k': [1, 2, 2, 2, 2],
                    'l': ['a', 'b', 'a', 'a', 'd']})
df2 = pd.DataFrame({'c': ['A', 'C'],
                    'l': ['b', 'a']})

# create a column marking df2 values
df2['marker'] = 1

# join the two, keeping all of df1's indices
joined = pd.merge(df1, df2, on=['c', 'l'], how='left')
joined

enter image description here

# extract desired columns where marker is NaN
joined[pd.isnull(joined['marker'])][df1.columns]

enter image description here

可能有一种方法可以在不使用临时数组的情况下做到这一点,但我想不出一个。只要您的数据不是很大,上述方法应该是一个快速而充分的答案。

关于python - pandas - 按行元素通过另一个数据框过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282119/

相关文章:

r - 排除特定行下方的所有记录

regex - Python 3 Pandas 使用 Startswith + 或选择 Dataframe

Python - 我可以(或应该)更改 os.path.sep 吗?

python - 如何在 robot.api 中调用监听器类?

python - 从 pandas 的 JSON 列中提取属于特定键的值

python - 如何将 groupby.first() 与转换函数一起使用

python - Pandas :将日期时间时间线从一个数据帧强加到另一个数据帧

python - `manage.py runserver` 和 Ctrl+C (Django)

python - 如何在标签中绘制带有汉字的图形

python - 在 iPython 中使用 HDF5 文件时出现异常 'HDFStore requires PyTables '