我正在尝试用vlookup
做一些在excel上看起来很简单的事情。下面所有的时间都是timedelta datatype
的。通过谷歌搜索错误,找不到适合我的解决方案。
DF1 (bellow)
是我的主要DataFrame,其中一个值就是到达时间。
+--------+------+
|Arrival | idBin|
+--------+------+
|10:01:40| nan |
|10:03:12| nan |
|10:05:55| nan |
|10:05:10| nan |
+--------+------+
DF2(bellow)
是带有1k+ time ranges的参数数据帧(手动创建字典似乎不切实际)。
+--------+--------+------+
|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.arrival
在DF2.start
和DF2.end
之间
到目前为止我尝试过的:
**.loc**
>返回ValueError: Can only compare identically-labeled Series objects
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
dt_range = pd.date_range(start=df2['start'].min(), end=df2['end'].max(), name=df2['idBin'])
发布于 2018-07-28 07:51:54
IIUC
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
发布于 2018-07-28 07:31:59
DF2_intervals = pd.Series(DF2['idBin'], pd.IntervalIndex.from_arrays(DF2['start'], DF2['end']))
DF1['idBin'] = DF1['Arrival'].map(DF2_intervals)
如果您愿意,您也可以将其转换为一行以提高效率。
如果有效的话,请告诉我。
发布于 2018-07-28 07:36:18
我不确定是否有pre_built解决方案,但您可以在UDF中执行类似的操作,然后将其应用于df1中的列,并让该列输出一个新列。
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))
https://stackoverflow.com/questions/51566566
复制相似问题