在两列之间的范围内搜索特定值python dataframe

2024-01-23

我有两个 csv 文件。根据 csv 文件 1 中单元格的值,我应该能够在 csv 文件 2 的列中搜索该值,并从 csv 文件 2 中的其他列获取相应的值。 如果这很令人困惑,我很抱歉。通过插图可能会变得清楚

CSV 文件 1

Car   Mileage
 A       8
 B       6
 C       10

CSV 文件 2

Score  Mileage(Min)    Mileage(Max)
 1       1                 3
 2       4                 6
 3       7                 9
 4       10                12 
 5       13                15 

我想要的输出 CSV 文件是这样的

Car    Mileage     Score
 A       8           3
 B       6           2
 C       10          4

汽车 A 根据其里程 8 获得 3 分,然后在 csv 文件 2 中查找该里程属于哪个范围,然后获取该范围的相应分数值。 任何帮助将不胜感激 提前致谢


截至撰写本文时,当前的稳定版本是 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')

这是我在这里所做的工作的高级概述。

  1. 首先,读入您的 CSV 文件
  2. Use pd.IntervalIndex建立区间索引tree。因此,搜索的复杂度现在是对数的。
  3. Use idx.get_indexer http://pandas.pydata.org/pandas-docs/version/0.16.1/generated/pandas.Index.get_indexer.html查找树中每个值的索引
  4. 使用索引来定位Score值在df1,并将其分配回df0。请注意,我打电话.values,否则赋值回来时,值会错位。
  5. 将结果写回 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在两列之间的范围内搜索特定值python dataframe 的相关文章

随机推荐