Skip to main content
 首页 » 编程设计

python之DataFrame 不会为新的 pandas 列赋值

2025年05月04日15傻小

我正在尝试将 pandas DataFrames df1.Number 中的所有值添加到日期范围匹配的 df2.Number 中。 我创建了一个看起来像这样的 df1:

       Start        End  Number 
0 2000-01-01 2000-01-08       1 
1 2000-01-02 2000-01-09       2 
2 2000-01-03 2000-01-10       3 
3 2000-01-04 2000-01-11       4 
4 2000-01-05 2000-01-12       5 
5 2000-01-06 2000-01-13       6 
6 2000-01-07 2000-01-14       7 

和 df2 看起来是这样的:

        Dates Number 
0  2000-01-01        
1  2000-01-02        
2  2000-01-03        
3  2000-01-04        
4  2000-01-05        
5  2000-01-06        
6  2000-01-07        
7  2000-01-08        
8  2000-01-09        
9  2000-01-10        
10 2000-01-11        
11 2000-01-12        
12 2000-01-13        
13 2000-01-14      

如果日期范围在行匹配

我使用的第一行代码是:

i = pd.date_range(df1.Start[0], df1.End[0]) 
 
if df2.Dates in i: 
    df2.Number.assign(df1.Number) 

它不会抛出错误,但也不会为 Number 分配任何内容。预期输出应如下所示:

        Dates Number 
0  2000-01-01 1      
1  2000-01-02 1,2       
2  2000-01-03 1,2,3     
3  2000-01-04 1,2,3,4  
4  2000-01-05 1,2,3,4,5 
5  2000-01-06 1,2,3,4,5,6       
6  2000-01-07 1,2,3,4,5,6,7     
7  2000-01-08 1,2,3,4,5,6,7    
8  2000-01-09 2,3,4,5,6,7 
9  2000-01-10 3,4,5,6,7 
10 2000-01-11 4,5,6,7 
11 2000-01-12 5,6,7 
12 2000-01-13 6,7  
13 2000-01-14 7  

任何人都可以建议为什么没有分配任何内容或可以为所有行执行此操作的代码吗?谢谢。

请您参考如下方法:

使用 numpy 和 dot 广播

s1=df1.Start.values 
s2=df1.End.values 
s=df2.Dates.values[:,None] 
pd.Series(((s1<=s)&(s2>=s)).dot(df1.Number.astype(str)+','),index=df2.index).str[:-1] 
#df2['Number']=pd.Series(((s1<=s)&(s2>=s)).dot(df1.Number.astype(str)+','),index=df2.index).str[:-1] 
Out[229]:  
0                 1 
1               1,2 
2             1,2,3 
3           1,2,3,4 
4         1,2,3,4,5 
5       1,2,3,4,5,6 
6     1,2,3,4,5,6,7 
7     1,2,3,4,5,6,7 
8       2,3,4,5,6,7 
9         3,4,5,6,7 
10          4,5,6,7 
11            5,6,7 
12              6,7 
13                7 
dtype: object