首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从两个独立的数据帧中按日期查找不匹配的值?

如何从两个独立的数据帧中按日期查找不匹配的值?
EN

Stack Overflow用户
提问于 2019-06-06 04:07:28
回答 3查看 40关注 0票数 1

如何从两个独立的数据帧中按日期查找不匹配的值?

我的数据帧如下所示:

代码语言:javascript
复制
import pandas as pd

data_1 = {'date':['2019-05-01','2019-05-02'],
          'id': ['1122','1133']}
data_2 = {'id': ['1122','1133','1144']}

df1 = pd.DataFrame(data_1, columns=['date','id'])
df2 = pd.DataFrame(data_2, columns=['id'])

我需要的结果是一个数据帧,它包含来自df2的任何id,该id与df1和df1的日期不匹配。

所以结果应该是这样的;

代码语言:javascript
复制
   date     id
2019-05-01 1133
2019-05-01 1144
2019-05-02 1122
2019-05-02 1144
EN

回答 3

Stack Overflow用户

发布于 2019-06-06 04:22:46

appenddrop_duplicates

创建一个起始数据帧,其中包含来自df1的日期和来自df2的ids的乘积

代码语言:javascript
复制
d = pd.DataFrame([
    [d, i] for d in df1.date
    for i in df2.id
], columns=df1.columns)

d.append(df1).drop_duplicates(keep=False)

         date    id
1  2019-05-01  1133
2  2019-05-01  1144
3  2019-05-02  1122
5  2019-05-02  1144

或者我们可以在构建步骤中跳过已有的

代码语言:javascript
复制
tups = {*zip(*map(df1.get, df1))}
pd.DataFrame([
    [d, i] for d in df1.date
    for i in df2.id if (d, i) not in tups
], columns=df1.columns)

         date    id
0  2019-05-01  1133
1  2019-05-01  1144
2  2019-05-02  1122
3  2019-05-02  1144

或者使用itertools.product和一些set逻辑

顺便说一句,我的最爱!

代码语言:javascript
复制
from itertools import product

pd.DataFrame(
    {*product(df1.date, df2.id)} - {*zip(*map(df1.get, df1))},
    columns=df1.columns
)

         date    id
0  2019-05-01  1144
1  2019-05-01  1133
2  2019-05-02  1144
3  2019-05-02  1122
票数 1
EN

Stack Overflow用户

发布于 2019-06-06 04:24:34

这更像是带有过滤器的CJ(交叉联接)问题

代码语言:javascript
复制
df1.assign(key=1).merge(df2.assign(key=1),on='key').loc[lambda x : x['id_x']!=x['id_y']].drop(['key','id_x'],1)
Out[262]: 
         date  id_y
1  2019-05-01  1133
2  2019-05-01  1144
3  2019-05-02  1122
5  2019-05-02  1144
票数 1
EN

Stack Overflow用户

发布于 2019-06-06 04:23:53

尝试:

代码语言:javascript
复制
# first we change `df1.id` to columns by crosstab:
u = pd.crosstab(df1.date, df1.id)

# extend the id with df2.id
u = u.reindex(df2['id'], axis=1, fill_value=0).stack()

那么你要找的是

代码语言:javascript
复制
u[u.eq(0)].index.to_frame().reset_index(drop=True)

输出:

代码语言:javascript
复制
          date  id
0   2019-05-01  1133
1   2019-05-01  1144
2   2019-05-02  1122
3   2019-05-02  1144
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56467291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档