当前位置: 首页 > 面试题库 >

合并其中一个值介于其他两个值之间的熊猫数据框

顾永福
2023-03-14
问题内容

这个问题已经在这里有了答案

如何联接两个列范围在一定范围内的数据框? (5个答案)

2年前关闭。

我需要在一个标识符和一个数据帧中的日期位于另一个数据帧中的两个日期之间的条件下合并两个熊猫数据帧。

数据框A具有日期(“ fdate”)和ID(“ cusip”):

在此处输入图片说明

我需要将此与此数据框B合并:

在此处输入图片说明

A.cusip==B.ncusipA.fdate之间B.namedtB.nameenddt

在SQL中,这是微不足道的,但是我看到的如何在pandas中做到这一点的唯一方法是,首先在标识符上无条件合并,然后在日期条件上进行过滤:

df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]

这真的是最好的方法吗?似乎最好是在合并中进行过滤,以免在合并后但在过滤器完成之前有一个非常大的数据帧。


问题答案:

如您所说,这在SQL中非常容易,那么为什么不在SQL中这样做呢?

import pandas as pd
import sqlite3

#We'll use firelynx's tables:
presidents = pd.DataFrame({"name": ["Bush", "Obama", "Trump"],
                           "president_id":[43, 44, 45]})
terms = pd.DataFrame({'start_date': pd.date_range('2001-01-20', periods=5, freq='48M'),
                      'end_date': pd.date_range('2005-01-21', periods=5, freq='48M'),
                      'president_id': [43, 43, 44, 44, 45]})
war_declarations = pd.DataFrame({"date": [datetime(2001, 9, 14), datetime(2003, 3, 3)],
                                 "name": ["War in Afghanistan", "Iraq War"]})
#Make the db in memory
conn = sqlite3.connect(':memory:')
#write the tables
terms.to_sql('terms', conn, index=False)
presidents.to_sql('presidents', conn, index=False)
war_declarations.to_sql('wars', conn, index=False)

qry = '''
    select  
        start_date PresTermStart,
        end_date PresTermEnd,
        wars.date WarStart,
        presidents.name Pres
    from
        terms join wars on
        date between start_date and end_date join presidents on
        terms.president_id = presidents.president_id
    '''
df = pd.read_sql_query(qry, conn)

df:

         PresTermStart          PresTermEnd             WarStart  Pres
0  2001-01-31 00:00:00  2005-01-31 00:00:00  2001-09-14 00:00:00  Bush
1  2001-01-31 00:00:00  2005-01-31 00:00:00  2003-03-03 00:00:00  Bush


 类似资料:
  • 问题内容: 我在加入熊猫方面遇到问题,并且试图找出问题所在。假设我有一个x: 我应该能够通过简单的连接命令在y = x上将y与索引上的y联接,除了同名具有+2。 我希望决赛对双方都有1941个非值。我也尝试过合并,但是我有同样的问题。 我以为正确的答案是pandas.concat([x,y]),但这也不符合我的预期。 编辑:如果您在加入方面遇到问题,请阅读下面的韦斯答案。我有一个重复的时间戳。 问

  • 如何确定给定整数是否介于其他两个整数之间(例如,大于/等于和小于/等于)? 我使用的是2.3 IDLE,到目前为止我所尝试的方法不起作用:

  • 如何确定给定的整数是否在其他两个整数之间(例如大于/等于和小于/等于)? 到目前为止我所尝试的并不奏效:

  • 问题内容: 我有两个数据框需要根据日期值是否适合其他两个日期之间进行合并。基本上,我需要在和之间执行外部联接。似乎合并和连接总是假定有一个公共列,在这种情况下,我没有。 问题答案: 创建日期时间的数据和格式: 创建键进行交叉连接: 筛选出在开始日期和结束日期之间不符合事件日期条件的记录: 加入原始日期范围表并放下关键列 输出:

  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 我有两个具有多列的数据帧。 我想比较df1['id']和df2['id'],并返回一个新的df,其中列['correct_id']具有匹配值。例子: df1: df2 这是我的代码: 我得到的结果是: 预期输出: 我该怎么解决这个问题拜托