DataFrame不会为新pandas列赋值

2024-10-05 14:21:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将pandas DataFramesdf1.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看起来是这样的:

^{pr2}$

如果行中的日期范围匹配,我尝试将Numberdf1分配给Number中的Number

我使用的第一行代码是:

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 

有人能告诉我为什么没有指定任何东西,或者有一个代码可以对所有行都这样做吗?谢谢。在


Tags: 代码innumberpandasdateifrangestart
2条回答

以下是一种方法:

s = df2.apply(lambda x: [((df1.loc[i,'Start'] < x) & (df1.loc[i,'End'] > x))
                        for i in range(len(df1))], axis = 1)

df2.assign(**s.apply(lambda x: np.unique(np.cumsum(x)) + 1).to_frame(name='Number'))

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

注意

确保日期为日期时间格式:

^{pr2}$

{{cd2>使用广播

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

相关问题 更多 >