首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python -根据一系列值(时间)从另一个dataframe 2中提取dataframe 1的值

python -根据一系列值(时间)从另一个dataframe 2中提取dataframe 1的值
EN

Stack Overflow用户
提问于 2018-07-28 07:06:37
回答 3查看 86关注 0票数 2

我正在尝试用vlookup做一些在excel上看起来很简单的事情。下面所有的时间都是timedelta datatype的。通过谷歌搜索错误,找不到适合我的解决方案。

DF1 (bellow)是我的主要DataFrame,其中一个值就是到达时间。

代码语言:javascript
复制
+--------+------+
|Arrival | idBin|
+--------+------+
|10:01:40|  nan |
|10:03:12|  nan |
|10:05:55|  nan |
|10:05:10|  nan |
+--------+------+

DF2(bellow)是带有1k+ time ranges的参数数据帧(手动创建字典似乎不切实际)。

代码语言:javascript
复制
+--------+--------+------+
|start   |end     |idBin |
+--------+--------+------+
|10:00:00|10:00:30|  1   |
|10:00:31|10:01:00|  2   |
|10:01:01|10:01:30|  3   |
|10:01:31|10:02:00|  4   |
+--------+--------+------+

我需要的是让DF2.idBin进入DF1.idBin,在那里DF1.arrivalDF2.startDF2.end之间

到目前为止我尝试过的

**.loc** >返回ValueError: Can only compare identically-labeled Series objects

代码语言:javascript
复制
    pd.DataFrame.loc[ (df1['arrival'] >= df2['start']) 
                     & (df1['arrival'] <= df2['end']), 'idBin'] = df2['idBin']

**date_range()**,因此我可以将其转换为字典,但返回TypeError: Cannot convert input [0 days 10:00:00] of type <class 'pandas._libs.tslibs.timedeltas.Timedelta'> to Timestamp

代码语言:javascript
复制
dt_range = pd.date_range(start=df2['start'].min(), end=df2['end'].max(), name=df2['idBin'])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-28 07:51:54

IIUC

代码语言:javascript
复制
x = pd.Series(df2['idBin'], pd.IntervalIndex.from_arrays(df2['start'], df2['end']))
inds = np.array([np.flatnonzero(np.array([k in z for z in x.index])) for k in df.Arrival])
bools = [arr.size>0 for arr in inds]
df.loc[bools, 'idBin'] = df2.iloc[[ind[0] for ind in inds[bools]]].idBin.values
票数 0
EN

Stack Overflow用户

发布于 2018-07-28 07:31:59

代码语言:javascript
复制
DF2_intervals = pd.Series(DF2['idBin'], pd.IntervalIndex.from_arrays(DF2['start'], DF2['end']))
DF1['idBin'] = DF1['Arrival'].map(DF2_intervals)

如果您愿意,您也可以将其转换为一行以提高效率。

如果有效的话,请告诉我。

票数 0
EN

Stack Overflow用户

发布于 2018-07-28 07:36:18

我不确定是否有pre_built解决方案,但您可以在UDF中执行类似的操作,然后将其应用于df1中的列,并让该列输出一个新列。

代码语言:javascript
复制
def match_idbin(date, df2):
    idbin = df2.loc[(df2['start'] > date)&
                (df2['end'] < date),'idBin']
    return idbin

df1['idBin'] = df1['Arrival'].apply(lambda x: match_idbin(x, df2))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51566566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档