根据 python 中第二个数据框中的列值从一个数据框中过滤记录
Filter record from one data frame based on column values in second data frame in python
我有两个 DataFrame df1 和 df2.
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
我有两个 DataFrame df1 和 df2.
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