【发布时间】:2018-03-27 23:40:34
【问题描述】:
我有一个使用 pandas IntervalIndex 设置的问题,类似于 here 和 here 提出的问题,但到目前为止,这些差异使我无法成功实施他们的解决方案。
我有两个 DataFrame,构造如下:
df1
month group time distance
0 1 A 10 100
1 1 A 20 120
2 1 A 25 110
3 1 B 5 90
4 1 B 7 99
5 1 B 17 60
6 1 C 30 200
7 1 C 35 170
8 2 A 5 40
9 2 A 10 27
10 2 B 17 33
11 2 B 19 65
df1.set_index(['month', 'group', 'time'], inplace=True)
df2
month group start end period
0 1 A 5 15 1
1 1 A 15 21 2
2 1 A 21 30 3
3 1 B 2 10 1
4 1 B 10 20 2
5 2 A 3 8 1
6 2 A 8 15 2
7 2 B 10 20 1
df2.set_index(['month', 'group'], inplace=True)
df2 中的start 和end 可用于定义间隔。我的真实数据要大得多,df1 大约 100,000 行,df2 大约 10,000 行。
我想做的是将period变量分配给df1,匹配month,group,如果df1['time']在df2的区间内。
上述问题中提出的问题有两个复杂性:
IntervalIndex需要只是MultiIndex的一部分,并且需要在索引的所有三个级别上进行匹配。有时
df1中的时间与df2中的时间间隔不匹配。如果这些行填充有NaN或其他缺失值,或者它们是否被完全删除,我没有强烈的偏好,但我不能拥有KeyError。
我的第一步是:
df2Index = pd.IntervalIndex.from_arrays(df2['start'], df2['end'], closed='left')
df2.set_index(df2Index, append=True, inplace=True)
将 IntervalIndex 应用于 df2,同时将 month 和 group 保留为更高级别的索引。
我尝试了一些方法,例如
period = df2.loc[df2.index.get_indexer(df1.index), 'period']
period = df2.get_loc(df1.index), 'period']
但我一直无法获得正确的索引行为。为了完整起见,我想要的结果是:
month group time distance period
0 1 A 10 100 1
1 1 A 20 120 2
2 1 A 25 110 3
3 1 B 5 90 1
4 1 B 7 99 1
5 1 B 17 60 2
6 1 C 30 200 NaN
7 1 C 35 170 NaN
8 2 A 5 40 1
9 2 A 10 27 2
10 2 B 17 33 1
11 2 B 19 65 1
(或同一张表,但没有period 为NaN 的两行)。
我的备份计划是遍历month 和group 的相关组合,适当地对两个表进行子集化,在这些子集表上使用IntervalIndex,然后重新组合它们。但这似乎是错误的解决方案。
【问题讨论】: