截至撰写本文时,当前的稳定版本是 v0.21。
要读取您的文件,请使用pd.read_csv https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html -
df0 = pd.read_csv('file1.csv')
df1 = pd.read_csv('file2.csv')
df0
Car Mileage
0 A 8
1 B 6
2 C 10
df1
Score Mileage(Min) Mileage(Max)
0 1 1 3
1 2 4 6
2 3 7 9
3 4 10 12
4 5 13 15
要查找分数,请使用pd.IntervalIndex https://pandas.pydata.org/pandas-docs/stable/generated/pandas.IntervalIndex.html通过致电IntervalIndex.from_tuples
。这应该很快 -
v = df1.loc[:, 'Mileage(Min)':'Mileage(Max)'].apply(tuple, 1).tolist()
idx = pd.IntervalIndex.from_tuples(v, closed='both') # you can also use `from_arrays`
df0['Score'] = df1.iloc[idx.get_indexer(df0.Mileage.values), 'Score'].values
df0
Car Mileage Score
0 A 8 3
1 B 6 2
2 C 10 4
其他创建方法IntervalIndex
已概述here https://pandas.pydata.org/pandas-docs/stable/generated/pandas.IntervalIndex.from_tuples.html#pandas.IntervalIndex.from_tuples.
要写入结果,请使用pd.DataFrame.to_csv https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html -
df0.to_csv('file3.csv')
这是我在这里所做的工作的高级概述。
- 首先,读入您的 CSV 文件
- Use
pd.IntervalIndex
建立区间索引tree。因此,搜索的复杂度现在是对数的。
- Use idx.get_indexer http://pandas.pydata.org/pandas-docs/version/0.16.1/generated/pandas.Index.get_indexer.html查找树中每个值的索引
- 使用索引来定位
Score
值在df1
,并将其分配回df0
。请注意,我打电话.values
,否则赋值回来时,值会错位。
- 将结果写回 CSV
欲了解更多信息Intervalindex
,看看这个 SO Q/A -在 pandas 中查找匹配间隔 Intervalindex https://stackoverflow.com/questions/46364710/finding-matching-intervals-in-pandas-intervalindex
注意IntervalIndex
是新的v0.20
,所以如果您有旧版本,请确保使用以下命令更新您的版本
pip install --upgrade pandas