python - Pandas 查找最接近配置文件的行

标签 python pandas

我有一个充满配置文件的文件,如下所示:

 profile_id  colA  colB  colC  colD
 1           1     20    50    63
 2           1     20    65    38
 3           8     5     3     4
 4           98    1     878   4
 ...

我有另一个 CSV,其中包含我想从中查找配置文件的结果:

col    value    score
colA   1        85
colA   1        856
colA   8        200000
colB   1        2356
colC   878      99999
colD   4        2
...

我想为每个具有最佳分数的 colX 提取 value,并在上一个文件中找到它关联到哪个 profile_id。

我所做的是有效的:

profiles = pd.read_csv("profiles.csv", sep="\t", index_col=False)
df = pd.read_csv("results.csv", sep="\t", index_col=False)

found_col = set(df["col"])
good_profile = profiles.copy()
for col in profiles.columns:
    if col == "profile_id":
        continue
    elif col not in found_col:
        print(f"{col} not found")
    else:
        value = int(df.loc[df[df["col"] == col]["score"].idxmax()].value)
        good_profile = good_profile[good_profile[col] == value]
 print(good_profile)

这给了我想要的结果,但我首先为第一列提取一个子集,然后为第二列提取该子集的一个子集,依此类推...

这很酷的一点是,当我错过一些很棒的列时,我也会得到一个结果。

我想知道是否有一种方法可以让它做得更好,而不必在以前的子集上创建子集。

最佳答案

这是我的尝试:

# extract the id with max scores
new_df = df2.loc[df2.groupby('col').score.idxmax(), ['col','value']]

# merge
new_df.merge(df1.melt(id_vars='profile_id', var_name='col'),
             on=['col','value'],
             how='left')

输出:

    col  value  profile_id
0  colA      8           3
1  colB      1           4
2  colC    878           4
3  colD      4           3
4  colD      4           4

关于python - Pandas 查找最接近配置文件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789071/

相关文章:

具有三个输入(列表)的 Python 3.3 循环?

python - 根据条件将pyspark数据帧拆分为多个数据帧

python - 递归搜索字典中包含子字符串的路径

python - 连接数据帧时处理极坐标中的空列

python - Pandas:将行索引更改为列索引。或相反亦然

python - 为什么在堆排序中使用平面列表?

python - getter 和 setter 的谷歌风格指南属性

python - 在 for 循环中访问过去的日期时间

python - 当 a 或 b 或 c 为 true 时删除 DataFrame 中的行

python - 在 Pandas 绘图上添加几天的刻度