根据两个dfs上的date列,将一个df的列追加到另一df-Pandas

丹麦文

我有两个df,如下所示。

df1:

Date                t_factor     
2020-02-01             5             
2020-02-02             23              
2020-02-03             14           
2020-02-04             23
2020-02-05             23  
2020-02-06             23          
2020-02-07             30            
2020-02-08             29            
2020-02-09             100
2020-02-10             38
2020-02-11             38               
2020-02-12             38                    
2020-02-13             70           
2020-02-14             70 
2020-02-15             38               
2020-02-16             38                    
2020-02-17             70           
2020-02-18             70 
2020-02-19             38               
2020-02-20             38                    
2020-02-21             70           
2020-02-22             70 
2020-02-23             38               
2020-02-24             38                    
2020-02-25             70           
2020-02-26             70 
2020-02-27             70 

df2:

From                to                   plan          score
2020-02-03          2020-02-05           start         20
2020-02-07          2020-02-08           foundation    25
2020-02-10          2020-02-12           learn         10
2020-02-14          2020-02-16           practice      20
2020-02-15          2020-02-21           exam          30
2020-02-20          2020-02-23           test          10

从上面的内容,我想plan基于df2中Fromand todate值和Datedf1中的追加df1。

预期产量:

output_df

Date                t_factor        plan
2020-02-01             5            NaN
2020-02-02             23           NaN   
2020-02-03             14           start          
2020-02-04             23           start
2020-02-05             23           start  
2020-02-06             23           NaN
2020-02-07             30           foundation               
2020-02-08             29           foundation        
2020-02-09             100          NaN
2020-02-10             38           learn
2020-02-11             38           learn              
2020-02-12             38           learn                   
2020-02-13             70           NaN
2020-02-14             70           practice
2020-02-15             38           NaN              
2020-02-16             38           NaN                    
2020-02-17             70           exam      
2020-02-18             70           exam
2020-02-19             38           exam   
2020-02-20             38           NaN                 
2020-02-21             70           NaN         
2020-02-22             70           test
2020-02-23             38           test             
2020-02-24             38           NaN        
2020-02-25             70           NaN
2020-02-26             70           NaN
2020-02-27             70           NaN

注意:

如果有任何重叠的日期,则将计划保留为该日期的NaN。

例:

2020-02-142020-02-16 planpractice

2020-02-152020-02-21 planexam

因此在2020-02-15上存在重叠2020-02-16

因此,planNaN针对该日期范围。

我想实现如下所示的功能。

def (df1, df2)
    return output_df
Shubham Sharma

使用:(如果数据框中的日期Fromto日期df2重叠,则此解决方案,我们需要从列中选择plan相对于最早日期的值

d1 = df1.sort_values('Date')
d2 = df2.sort_values('From')


df = pd.merge_asof(d1, d2[['From', 'plan']], left_on='Date', right_on='From')
df = pd.merge_asof(df, d2[['to', 'plan']],   left_on='Date', right_on='to',
                   direction='forward', suffixes=['', '_r']).drop(['From', 'to'], 1)

df['plan'] = df['plan'].mask(df['plan'].ne(df.pop('plan_r')))

细节:

使用pd.merge_asof到执行ASOF合并的dataframesd1d2相应栏目Date,并From用默认direction='backward'创建一个新的合并数据框df,再次使用pd.merge_asofASOF合并的dataframesdfd2相应的列Datetodirection='forward'

print(df)

         Date  t_factor        plan      plan_r
0  2020-02-01         5         NaN       start
1  2020-02-02        23         NaN       start
2  2020-02-03        14       start       start
3  2020-02-04        23       start       start
4  2020-02-05        23       start       start
5  2020-02-06        23       start  foundation
6  2020-02-07        30  foundation  foundation
7  2020-02-08        29  foundation  foundation
8  2020-02-09       100  foundation       learn
9  2020-02-10        38       learn       learn
10 2020-02-11        38       learn       learn
11 2020-02-12        38       learn       learn
12 2020-02-13        70       learn    practice
13 2020-02-14        70    practice    practice
14 2020-02-15        38        exam    practice
15 2020-02-16        38        exam    practice
16 2020-02-17        70        exam        exam
17 2020-02-18        70        exam        exam
18 2020-02-19        38        exam        exam
19 2020-02-20        38        test        exam
20 2020-02-21        70        test        exam
21 2020-02-22        70        test        test
22 2020-02-23        38        test        test
23 2020-02-24        38        test         NaN
24 2020-02-25        70        test         NaN
25 2020-02-26        70        test         NaN
26 2020-02-27        70        test         NaN

使用Series.ne+Series.mask掩盖不等于的plan的值planplan_r

print(df)

         Date  t_factor        plan
0  2020-02-01         5         NaN
1  2020-02-02        23         NaN
2  2020-02-03        14       start
3  2020-02-04        23       start
4  2020-02-05        23       start
5  2020-02-06        23         NaN
6  2020-02-07        30  foundation
7  2020-02-08        29  foundation
8  2020-02-09       100         NaN
9  2020-02-10        38       learn
10 2020-02-11        38       learn
11 2020-02-12        38       learn
12 2020-02-13        70         NaN
13 2020-02-14        70    practice
14 2020-02-15        38         NaN
15 2020-02-16        38         NaN
16 2020-02-17        70        exam
17 2020-02-18        70        exam
18 2020-02-19        38        exam
19 2020-02-20        38         NaN
20 2020-02-21        70         NaN
21 2020-02-22        70        test
22 2020-02-23        38        test
23 2020-02-24        38         NaN
24 2020-02-25        70         NaN
25 2020-02-26        70         NaN
26 2020-02-27        70         NaN

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据另一个中的值填充新的pandas df列

如果值相同,Python Pandas将列从df复制到另一个

pandas:从一个df中搜索包含列表的另一个df列中的列值

按列将两个Pandas系列附加到一个数据框

如何使用另一列中的一个键将pandas df与多列合并?

pandas:使用与另一个df中的索引和列匹配的值填充df列

pandas数据框将列值追加到另一个具有列表元素的pandas列

将pandas.DataFrame追加到另一个pandas.DataFrame的一列

Pandas列,其中每个值取决于另一个df查询

从第三列为1的另一列中的最后一个值创建pandas df列

将Pandas df中的行替换为另一个df中的行

如果同一行存在于另一个数据框中但以两个df中的所有列结尾时,如何从Pandas数据框中删除行

Python Pandas根据在另一个数据框中的查找将列添加到数据框

如何在将两个列中的公共列值匹配的同时将列从pandas数据框复制到另一个?

如何将某些单元格值从Pandas DF中的2列移动到另一个新列?

如何将新列添加到pandas df,以便从另一个数据帧返回同一组中较大的最小值

Python Pandas-在特定行上添加列,将特定行从一个数据框添加到另一个

将列从一个数据框添加到另一个python pandas

根据索引列表将列从一个Df追加到另一个

将列df值追加到另一个df

如何使用Pandas DF绘制计数条形图,按一个分类列分组并用另一列着色

根据另一个Pandas列中的条件添加到python列表的正确方法是什么?

如何根据另一个列中的值将函数应用于Pandas中的列?

根据特定列将pandas数据框列替换为另一个数据框

Python Pandas根据最后一个元素和剩余元素将列分为两列

根据Pandas中的一个公共列从另一个数据框更新多个列

Python / Pandas:如果存在匹配项,则将值从一个df添加到另一df的行末

Python Pandas根据另一个列值创建新列

Python Pandas根据另一个列中的总数从另一个dataFrame中选择值