我正在尝试将 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
