根据 python 中第二个数据框中的列值从一个数据框中过滤记录

Filter record from one data frame based on column values in second data frame in python

我有两个 DataFrame df1df2.

df1 是原始数据集,df2 是 df1 经过一些操作后的数据集。

df1 我有专栏 'log'df2 我有列 'log1''log2' 两列。

其中 'log1''log2' 列中的值包含在 'log'df1.

下面的 df2 示例

date  id     log1    log2
1   uu1q    (2,4)   (3,5)
1   uu1q    (2,4)   (7,6)
1   uu1q    (3,5)   (7,6)
5   u25a    (4,7)   (3,9)
5   uu25a   (1,9)   (3,9)
6   ua3b7   (1,1)   (2,2)
6   ua3b7   (1,1)   (3,3)
6   ua3b7   (2,2)   (3,3)

df1 列示例,数据如下

date id     log    name   col1  col2
1   uu1q    (2,4)   xyz   1123  qqq
1   uu1q    (3,5)   aas   2132  wew
1   uu1q    (7,6)   wqas  2567  uuo
5   u25a    (4,7)   enj   666   ttt
5   fff     (0,0)   ddd   0     lll

现在我想根据 df2 中每一行的列值获取 fetch/filter 来自 df1 的所有记录,即基于 'date''id''log1''log2' 并将其与 df1 中的列进行比较,即 'date', 'id', 'log'.

注意: 值列 'log1''log2'包含在单列中 'log'

IIUC,您正在寻找链式 isin:

out = df1[df1['date'].isin(df2['date']) & df1['id'].isin(df2['id']) & (df1['log'].isin(df2['log1']) | df1['log'].isin(df2['log2']))]

输出:

   date    id    log  name  col1 col2
0     1  uu1q  (2,4)   xyz  1123  qqq
1     1  uu1q  (3,5)   aas  2132  wew
2     1  uu1q  (7,6)  wqas  2567  uuo
3     5  u25a  (4,7)   enj   666  ttt

使用DataFrame.melt for column log from log1, log2... columns and for filtering inner join in DataFrame.merge:

df = (df2.melt(['date','id'], value_name='log')
         .drop('variable', axis=1)
         .drop_duplicates()
         .merge(df1))
print (df)
   date    id    log  name  col1 col2
0     1  uu1q  (2,4)   xyz  1123  qqq
1     1  uu1q  (3,5)   aas  2132  wew
2     5  u25a  (4,7)   enj   666  ttt
3     1  uu1q  (7,6)  wqas  2567  uuo