我有两个数据框。
df1包含数字和时间戳。这是一个很大的集合。
df1.head()
Out[292]:
2016-08-31 08:09:00 1.0
2016-08-31 08:11:00 7.0
2016-08-31 08:14:00 90.0
df2包含间隔
d2.head()
Out[292]:
start stop C
2016-08-31 08:09:00 2016-08-31 08:12:00 'a'
2016-08-31 08:13:00 2016-08-31 08:20:00 'b'
2016-08-31 08:20:00 2016-08-31 08:45:00 'c'
我想向C
添加一个新列df1
,以使C
的值对应于df2
中包含索引的时间间隔的值的df1
。
预期结果
df1.head()
Out[292]: C
2016-08-31 08:09:00 1.0 'a'
2016-08-31 08:11:00 7.0 'a'
2016-08-31 08:14:00 90.0 'b'
到目前为止,我已经尝试过:
df1.loc[:,'C']=df1.index.map(lambda i:df2[np.logical_and(i>df2.starti<df2.stop)].C)
但是它效率极低,并且在某些情况下会崩溃,因为某些情况下df2的间隔列表中缺少索引值。
如何有效地做到这一点?
答案 0 :(得分:3)
首先由IntervalIndex.from_arrays
创建IntervalIndex
:
s = pd.IntervalIndex.from_arrays(df2['start'], df2['stop'], 'both')
print (s)
IntervalIndex([[2016-08-31 08:09:00, 2016-08-31 08:12:00],
[2016-08-31 08:13:00, 2016-08-31 08:20:00],
[2016-08-31 08:20:00, 2016-08-31 08:45:00]],
closed='both',
dtype='interval[datetime64[ns]]')
然后通过新的IntervalIndex
set_index
设置为values
创建的数组的新列:
df1['C'] = df2.set_index(s).loc[df1.index, 'C'].values
print (df1)
A C
2016-08-31 08:09:00 1.0 a
2016-08-31 08:11:00 7.0 a
2016-08-31 08:14:00 90.0 b
编辑:
s = pd.IntervalIndex.from_arrays(df2['start'].astype(np.int64),
df2['stop'].astype(np.int64), 'both')
print (s)
IntervalIndex([[1472630940000000000, 1472631120000000000],
[1472631180000000000, 1472631600000000000],
[1472631600000000000, 1472633100000000000]],
closed='both',
dtype='interval[int64]')
df1['C'] = df2.set_index(s).loc[df1.index.astype(np.int64), 'C'].values
print (df1)
A C
2016-08-31 08:09:00 1.0 a
2016-08-31 08:11:00 7.0 a
2016-08-31 08:14:00 90.0 b