我有两个DataFrame:

import pandas as pd

df1 = pd.DataFrame(
    {
        'date': ['2024-01-01','2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08', '2024-01-09', '2024-01-10', '2024-01-11', '2024-01-12', '2024-01-13'],
        'price': list(range(13))
    }
)

df2 = pd.DataFrame(
    {
        'start': ['2024-01-01', '2024-01-03', '2024-01-10'],
        'end': ['2024-01-03', '2024-01-08', '2024-01-12'],
        'id': ['a', 'b', 'c']
    }
)

这是预期输出.我想把id加到df1:

         date  price   id
0  2024-01-01      0  NaN
1  2024-01-02      1    a
2  2024-01-03      2    a
3  2024-01-04      3    b
4  2024-01-05      4    b
5  2024-01-06      5    b
6  2024-01-07      6    b
7  2024-01-08      7    b
8  2024-01-09      8  NaN
9  2024-01-10      9  NaN
10 2024-01-11     10    c
11 2024-01-12     11    c
12 2024-01-13     12  NaN

过程是这样的.让我举一个输出行1的例子:

a) The date is 2024—01—02.看df2.每行df2都有一个范围.这个date在第一行df2之间.注意,start是互斥的,end是包容的.

b)df2中标识的行中获取id并输入输出.

由于这两个DataFrame之间没有公共列,所以我使用了一个循环来获得输出.这是可行的,但我不确定这是否是最好的方法:

df1['date'] = pd.to_datetime(df1.date)
df2[['start', 'end']] = df2[['start', 'end']].apply(pd.to_datetime)
for idx, row in df2.iterrows():
    start = row['start']
    end = row['end']
    id = row['id']

    df1.loc[df1.date.between(start, end, inclusive='right'), 'id'] = id

有什么建议吗?

推荐答案

另一个选项,使用pd.cut:

bins = pd.IntervalIndex.from_arrays(df2["start"], df2["end"])
df1["id"] = pd.cut(df1["date"], bins).map(dict(zip(bins, df2["id"])))

print(df1)

打印:

         date  price   id
0  2024-01-01      0  NaN
1  2024-01-02      1    a
2  2024-01-03      2    a
3  2024-01-04      3    b
4  2024-01-05      4    b
5  2024-01-06      5    b
6  2024-01-07      6    b
7  2024-01-08      7    b
8  2024-01-09      8  NaN
9  2024-01-10      9  NaN
10 2024-01-11     10    c
11 2024-01-12     11    c
12 2024-01-13     12  NaN

Python相关问答推荐

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

根据条件将新值添加到下面的行或下面新创建的行中

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

如何避免Chained when/then分配中的Mypy不兼容类型警告?

Python库:可选地支持numpy类型,而不依赖于numpy

Telethon加入私有频道

numpy卷积与有效

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

Pandas DataFrame中行之间的差异

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

Polars asof在下一个可用日期加入

旋转多边形而不改变内部空间关系

* 动态地 * 修饰Python中的递归函数

在matplotlib中使用不同大小的标记顶部添加批注

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

从旋转的DF查询非NaN值

如果有2个或3个,则从pandas列中删除空格

提取最内层嵌套链接

Python日志(log)库如何有效地获取lineno和funcName?

我可以同时更改多个图像吗?