Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用较小数据帧中的日期范围和列值筛选较大的数据帧_Python_Pandas - Fatal编程技术网

Python 使用较小数据帧中的日期范围和列值筛选较大的数据帧

Python 使用较小数据帧中的日期范围和列值筛选较大的数据帧,python,pandas,Python,Pandas,我有一个更大的数据帧,df1,看起来像这样: Data PatId EntryDate Id 725 2005-01-03 1422 X 2005-01-04 1563 X 2005-01-05 1355 X 2005-01-06 118 X 2005-01-09 1400 X .

我有一个更大的数据帧,df1,看起来像这样:

                         Data
PatId  EntryDate  Id                                        
725    2005-01-03 1422   X
       2005-01-04 1563   X
       2005-01-05 1355   X
       2005-01-06 118    X
       2005-01-09 1400   X
...                                                       
117785 2004-12-31 799998 X
       2005-01-03 796833 X
       2005-01-05 798728 X
       2005-01-08 798545 X 
       2005-01-11 797632 X
                         PatId
EntryDate  ExitDate          
2005-01-15 2005-04-15   22407
2005-01-30 2005-04-30   95938
2005-02-07 2005-05-07  116812
2005-02-18 2005-05-18   12163
2005-02-21 2005-05-21   22908
和一个较小的数据帧,看起来像这样:

                         Data
PatId  EntryDate  Id                                        
725    2005-01-03 1422   X
       2005-01-04 1563   X
       2005-01-05 1355   X
       2005-01-06 118    X
       2005-01-09 1400   X
...                                                       
117785 2004-12-31 799998 X
       2005-01-03 796833 X
       2005-01-05 798728 X
       2005-01-08 798545 X 
       2005-01-11 797632 X
                         PatId
EntryDate  ExitDate          
2005-01-15 2005-04-15   22407
2005-01-30 2005-04-30   95938
2005-02-07 2005-05-07  116812
2005-02-18 2005-05-18   12163
2005-02-21 2005-05-21   22908

我想用一种优雅的方式过滤
df1
,只包括
PatId
EntryDate
ExitDate
索引之间的每个
PatId
的行,这样就可以在
PatId
中将两个数据框合并在一起,从而使进入和退出日期保持一致df1,然后您只需要使用datetime比较来筛选它。我还重置了您的索引,并在最终显示中删除了helper列,但请执行您想要的操作

例如:

import pandas as pd
df1 = pd.DataFrame({'PatId': [725, 725, 725, 725, 117785, 117785],
                   'EntryDate': ['2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06',
                                '2004-12-31', '2005-01-03'],
                   'Id': [1422, 1563, 1355, 118, 7999998, 796833],
                   'Data': ['X','X','X','X','X','X']})
df1['EntryDate'] = pd.to_datetime(df1.EntryDate)
df1.set_index(['PatId', 'EntryDate', 'Id'])

df2 = pd.DataFrame({'PatId': [725, 117785],
                   'EntryDate': ['2005-01-04', '2005-01-02'],
                   'ExitDate': ['2005-01-05', '2006-01-18']})
df2['EntryDate'] = pd.to_datetime(df2.EntryDate)
df2['ExitDate'] = pd.to_datetime(df2.ExitDate)
df2.set_index(['EntryDate', 'ExitDate'])
这是实际代码:

df = df1.reset_index().merge(df2.reset_index(), on='PatId', how='left', suffixes=['','_1'])

(df[(df.EntryDate >= df['EntryDate_1']) & (df.EntryDate <= df.ExitDate)]
    .drop(columns=['EntryDate_1', 'ExitDate'])
    .set_index(['PatId', 'EntryDate', 'Id']))

                         Data
PatId  EntryDate  Id         
725    2005-01-04 1563      X
       2005-01-05 1355      X
117785 2005-01-03 796833    X
df=df1.reset_index().merge(df2.reset_index(),on='PatId',how='left',后缀=['',''u 1']))

(df[(df.EntryDate>=df['EntryDate_1'])和(df.EntryDate您可以在
PatId
上将两个数据帧合并在一起,这将把进入和退出日期带到df1,然后您只需要使用日期时间比较来筛选它。我还重置了您拥有的索引,并在最终显示中删除了辅助列,但请按您的要求执行

例如:

import pandas as pd
df1 = pd.DataFrame({'PatId': [725, 725, 725, 725, 117785, 117785],
                   'EntryDate': ['2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06',
                                '2004-12-31', '2005-01-03'],
                   'Id': [1422, 1563, 1355, 118, 7999998, 796833],
                   'Data': ['X','X','X','X','X','X']})
df1['EntryDate'] = pd.to_datetime(df1.EntryDate)
df1.set_index(['PatId', 'EntryDate', 'Id'])

df2 = pd.DataFrame({'PatId': [725, 117785],
                   'EntryDate': ['2005-01-04', '2005-01-02'],
                   'ExitDate': ['2005-01-05', '2006-01-18']})
df2['EntryDate'] = pd.to_datetime(df2.EntryDate)
df2['ExitDate'] = pd.to_datetime(df2.ExitDate)
df2.set_index(['EntryDate', 'ExitDate'])
这是实际代码:

df = df1.reset_index().merge(df2.reset_index(), on='PatId', how='left', suffixes=['','_1'])

(df[(df.EntryDate >= df['EntryDate_1']) & (df.EntryDate <= df.ExitDate)]
    .drop(columns=['EntryDate_1', 'ExitDate'])
    .set_index(['PatId', 'EntryDate', 'Id']))

                         Data
PatId  EntryDate  Id         
725    2005-01-04 1563      X
       2005-01-05 1355      X
117785 2005-01-03 796833    X
df=df1.reset_index().merge(df2.reset_index(),on='PatId',how='left',后缀=['',''u 1']))

(df[(df.EntryDate>=df['EntryDate_1'])和(df.EntryDate到目前为止,您尝试了什么来实现这一点?我已经使用
pd.concat
并通过
EntryDate
ExitDate
进行切片,仅基于日期过滤了
DataFrame
,但我不确定如何通过每个日期范围对应的
PatId
@spacemud Id和PatId进行过滤e?您能显示输出吗?@YOLO No-
Id
是从CSV读取此数据时每行的唯一标识符。
PatId
是患者Id的缩写,单个患者可能有多个与之相关的记录。我更新了我的问题以使事情更清楚。您所说的“显示输出”是什么意思?这些
dataframes
过大?有一种相当简单且短的方法可以实现这一点,但内存效率不是很高,但如果这不是一个问题,它可能是您最好的方法。到目前为止,您尝试了什么来实现这一点?我已经成功地使用
pd.concat
和通过
EntryDate
ExitDate
,但我不确定如何也按每个日期范围对应的
PatId
对其进行过滤@spacemud Id和PatId是相同的?请显示输出好吗?@YOLO No-
Id
是从CSV读取数据时每行的唯一标识符。
PatId
是患者的缩写一个患者可能有多个与之相关的记录。我更新了我的问题以使事情更清楚。你说的“显示输出”是什么意思?这些
数据帧是否过大?有一种非常简单和简短的方法来实现这一点,但内存效率不是很高,但如果这不是一个问题,很可能你最好的。