比较数据框内的日期并将值分配给另一个变量

最棒的

我有两个数据框(df和df1),如下所示

df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                        'start_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM',                                        '06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM']})
df.start_date = pd.to_datetime(df.start_date)
df['end_date'] = df.start_date + timedelta(days=5)
df['enc_id'] = ['ABC1','ABC2','ABC3','ABC4','DEF1','DEF2','DEF3']

df1 = pd.DataFrame({'person_id': [101,101,101,101,101,101,101,202,202,202,202,202,202,202,202],'date_1':['07/07/2013 11:20:00 AM','05/07/2013 02:30:00 PM','06/07/2013 02:40:00 PM','08/06/2014 12:00:00 AM','11/06/2014 12:00:00 AM','02/03/2013 12:30:00 PM','13/06/2014 12:00:00 AM','12/11/2011 12:00:00 AM','13/10/2012 07:00:00 AM','13/12/2015 12:00:00 AM','13/12/2012 12:00:00 AM','13/12/2012 06:30:00 PM','13/07/2011 10:00:00 AM','18/12/2012 10:00:00 AM', '19/12/2013 11:00:00 AM']})
df1['date_1'] = pd.to_datetime(df1['date_1'])
df1['within_id'] = ['ABC','ABC','ABC','ABC','ABC','ABC','ABC','DEF','DEF','DEF','DEF','DEF','DEF','DEF',np.nan]

我想做的是

a)从df1“ within_id”列中选择不具有NA的每个人,并检查他们date_1是否在(df.start_date - 1) and (同一个人的df.end_date +1)之间df以及相同within_id相同enc_id

例如:对于subject = 101和within_id= ABC,我们有date_1is 7/7/2013,请检查它们是否在4/7/2013df.start_date - 1)和11/7/2013df.end_date + 1)之间。

由于第一行比较本身就为我们提供了结果,因此我们无需将其date_1与df中的其他记录进行比较subject 101如果不是,我们需要查找/扫描,直到找到date_1落入的间隔

b)如果找到日期间隔,则将对应的enc_idfrom分配dfwithin_idindf1

c)如果没有,则分配“超出范围”

我尝试了以下

t1 = df.groupby('person_id').apply(pd.DataFrame.sort_values, 'start_date')
t2 = df1.groupby('person_id').apply(pd.DataFrame.sort_values, 'date_1')
t3= pd.concat([t1, t2], axis=1)
t3['within_id'] = np.where((t3['date_1'] >= t3['start_date'] && t3['person_id'] == t3['person_id_x'] && t3['date_2'] >= t3['end_date']),enc_id]

我希望我的输出(也请参见屏幕快照底部的第14行)如下所示。由于我打算将该解决方案应用于大数据(4/5百万条记录,并且可能有5000-6000个唯一的person_id),因此任何有效且优雅的解决方案都将有所帮助

在此处输入图片说明

   14      202     2012-12-13 11:00:00   NA
Shubham Sharma

让我们做:

d = df1.merge(df.assign(within_id=df['enc_id'].str[:3]),
              on=['person_id', 'within_id'], how='left', indicator=True)

m = d['date_1'].between(d['start_date'] - pd.Timedelta(days=1),
                        d['end_date']   + pd.Timedelta(days=1))

d = df1.merge(d[m | d['_merge'].ne('both')], on=['person_id', 'date_1'], how='left')
d['within_id'] = d['enc_id'].fillna('out of range').mask(d['_merge'].eq('left_only'))
d = d[df1.columns]

细节:

merge数据帧df1dfperson_idwithin_id

print(d)
    person_id              date_1 within_id          start_date            end_date enc_id     _merge
0         101 2013-07-07 11:20:00       ABC 2013-05-07 09:27:00 2013-05-12 09:27:00   ABC1       both
1         101 2013-07-07 11:20:00       ABC 2013-09-08 11:21:00 2013-09-13 11:21:00   ABC2       both
2         101 2013-07-07 11:20:00       ABC 2014-06-06 08:00:00 2014-06-11 08:00:00   ABC3       both
3         101 2013-07-07 11:20:00       ABC 2014-06-06 05:00:00 2014-06-11 10:00:00   DEF1       both
....
47        202 2012-12-18 10:00:00       DEF 2012-10-13 00:00:00 2012-10-18 00:00:00   DEF2       both
48        202 2012-12-18 10:00:00       DEF 2012-12-13 11:45:00 2012-12-18 11:45:00   DEF3       both
49        202 2013-12-19 11:00:00       NaN                 NaT                 NaT    NaN  left_only

创建一个布尔蒙版m来表示date_1介于df.start_date - 1 days之间的条件df.end_date + 1 days

print(m)
0     False
1     False
2     False
3     False
...
47    False
48     True
49    False
dtype: bool

再次merge将数据df1保留为已使用mperson_id上的掩码过滤的数据框date_1

print(d)

    person_id              date_1 within_id_x within_id_y          start_date            end_date enc_id     _merge
0         101 2013-07-07 11:20:00         ABC         NaN                 NaT                 NaT    NaN        NaN
1         101 2013-05-07 14:30:00         ABC         ABC 2013-05-07 09:27:00 2013-05-12 09:27:00   ABC1       both
2         101 2013-06-07 14:40:00         ABC         NaN                 NaT                 NaT    NaN        NaN
3         101 2014-08-06 00:00:00         ABC         NaN                 NaT                 NaT    NaN        NaN
4         101 2014-11-06 00:00:00         ABC         NaN                 NaT                 NaT    NaN        NaN
5         101 2013-02-03 12:30:00         ABC         NaN                 NaT                 NaT    NaN        NaN
6         101 2014-06-13 00:00:00         ABC         NaN                 NaT                 NaT    NaN        NaN
7         202 2011-12-11 00:00:00         DEF         DEF 2011-12-11 10:00:00 2011-12-16 10:00:00   DEF1       both
8         202 2012-10-13 07:00:00         DEF         DEF 2012-10-13 00:00:00 2012-10-18 00:00:00   DEF2       both
9         202 2015-12-13 00:00:00         DEF         NaN                 NaT                 NaT    NaN        NaN
10        202 2012-12-13 00:00:00         DEF         DEF 2012-12-13 11:45:00 2012-12-18 11:45:00   DEF3       both
11        202 2012-12-13 18:30:00         DEF         DEF 2012-12-13 11:45:00 2012-12-18 11:45:00   DEF3       both
12        202 2011-07-13 10:00:00         DEF         NaN                 NaT                 NaT    NaN        NaN
13        202 2012-12-18 10:00:00         DEF         DEF 2012-12-13 11:45:00 2012-12-18 11:45:00   DEF3       both
14        202 2013-12-19 11:00:00         NaN         NaN                 NaT                 NaT    NaN  left_only

填充中的值within_id从柱enc_id和使用Series.fillna填充的NaN排除不从符合的那些dfout of range,最后筛选列,得到的结果:

print(d)
    person_id              date_1     within_id
0         101 2013-07-07 11:20:00  out of range
1         101 2013-05-07 14:30:00          ABC1
2         101 2013-06-07 14:40:00  out of range
3         101 2014-08-06 00:00:00  out of range
4         101 2014-11-06 00:00:00  out of range
5         101 2013-02-03 12:30:00  out of range
6         101 2014-06-13 00:00:00  out of range
7         202 2011-12-11 00:00:00          DEF1
8         202 2012-10-13 07:00:00          DEF2
9         202 2015-12-13 00:00:00  out of range
10        202 2012-12-13 00:00:00          DEF3
11        202 2012-12-13 18:30:00          DEF3
12        202 2011-07-13 10:00:00  out of range
13        202 2012-12-18 10:00:00          DEF3
14        202 2013-12-19 11:00:00           NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

在Python中将一个变量的值分配给另一个变量时会发生什么?

来自分类Dev

将Object成员变量分配给另一个双重强指针

来自分类Dev

如何从另一个类更改或将值分配给私有变量JTextField?

来自分类Dev

在TCL中将变量的值分配给另一个变量

来自分类Dev

bash脚本,从另一个shell执行shell并将结果分配给变量

来自分类Dev

如何获取editorfor的值并将此值分配给另一个editorfor?

来自分类Dev

拆分或剪切并将变量的值分配给UNIX中的另一个变量

来自分类Dev

在Bash中将一个变量分配给另一个变量?

来自分类Dev

将参数分配给另一个变量有什么好处

来自分类Dev

将String变量的值分配给另一个String变量

来自分类Dev

将const变量的成员分配给另一个const

来自分类Dev

在函数中获取变量并将其分配给其范围之外的另一个变量

来自分类Dev

如何将Angular @Input值分配给另一个变量并填充到子代中?

来自分类Dev

如何将公式的值(包含变量)分配给另一个变量

来自分类Dev

如何选择CSS变量并将样式值分配给另一个元素

来自分类Dev

将struct的第一个变量分配给另一个

来自分类Dev

使用另一个数据框将值分配给多列数据框

来自分类Dev

将另一个网页的特定数据分配给变量或数组

来自分类Dev

如何从另一个类更改或将值分配给私有变量JTextField?

来自分类Dev

如何从图像中的一个像素提取数据并将该数据分配给另一图像中的另一个像素?

来自分类Dev

C:遍历SQLite记录并将每个值分配给一个变量

来自分类Dev

删除碎片并将其空间分配给另一个

来自分类Dev

bash脚本,从另一个shell执行shell并将结果分配给变量

来自分类Dev

Python将值从一个变量分配给另一个

来自分类Dev

python即使将输入变量分配给另一个变量,如何更改它的值?

来自分类Dev

Pandas 数据框:搜索并将唯一值分配给另一个数据框

来自分类Dev

如何通过 BASH 主机命令一个变量并将答案分配给另一个变量

来自分类Dev

无法将结构变量分配给另一个结构变量

来自分类Dev

HTML - 如何将文本值分配给另一个属性的值?

Related 相关文章

  1. 1

    在Python中将一个变量的值分配给另一个变量时会发生什么?

  2. 2

    将Object成员变量分配给另一个双重强指针

  3. 3

    如何从另一个类更改或将值分配给私有变量JTextField?

  4. 4

    在TCL中将变量的值分配给另一个变量

  5. 5

    bash脚本,从另一个shell执行shell并将结果分配给变量

  6. 6

    如何获取editorfor的值并将此值分配给另一个editorfor?

  7. 7

    拆分或剪切并将变量的值分配给UNIX中的另一个变量

  8. 8

    在Bash中将一个变量分配给另一个变量?

  9. 9

    将参数分配给另一个变量有什么好处

  10. 10

    将String变量的值分配给另一个String变量

  11. 11

    将const变量的成员分配给另一个const

  12. 12

    在函数中获取变量并将其分配给其范围之外的另一个变量

  13. 13

    如何将Angular @Input值分配给另一个变量并填充到子代中?

  14. 14

    如何将公式的值(包含变量)分配给另一个变量

  15. 15

    如何选择CSS变量并将样式值分配给另一个元素

  16. 16

    将struct的第一个变量分配给另一个

  17. 17

    使用另一个数据框将值分配给多列数据框

  18. 18

    将另一个网页的特定数据分配给变量或数组

  19. 19

    如何从另一个类更改或将值分配给私有变量JTextField?

  20. 20

    如何从图像中的一个像素提取数据并将该数据分配给另一图像中的另一个像素?

  21. 21

    C:遍历SQLite记录并将每个值分配给一个变量

  22. 22

    删除碎片并将其空间分配给另一个

  23. 23

    bash脚本,从另一个shell执行shell并将结果分配给变量

  24. 24

    Python将值从一个变量分配给另一个

  25. 25

    python即使将输入变量分配给另一个变量,如何更改它的值?

  26. 26

    Pandas 数据框:搜索并将唯一值分配给另一个数据框

  27. 27

    如何通过 BASH 主机命令一个变量并将答案分配给另一个变量

  28. 28

    无法将结构变量分配给另一个结构变量

  29. 29

    HTML - 如何将文本值分配给另一个属性的值?

热门标签

归档