【问题标题】:How do I find the closest values of one dataframe column and return the column value and position of other dataframe如何找到一个数据框列的最接近值并返回其他数据框的列值和位置
【发布时间】:2021-08-27 01:22:35
【问题描述】:

我有两个数据框,如下所示。我想不出如何从 df1 中找到最接近的 df2 值 - "T" 列,并从 df1 中找到 Pos、Sr 和最接近的值,然后按照以下输出添加到 df2。

我的试验如下,但没有给我正确的输出。

import pandas as pd
 
df1 = pd.DataFrame({
        'Sr':[1000, 1002, 1004, 1009],
        'W1':[20.1, 20.3, 19.1, 18.5],
        'W2':[45.155, 45.180, 19.115, 19.126],
        'W3':[20, 22, 19, 18]
        })

df2 = pd.DataFrame({
        'W':["W1", "W2", "W3"],
        'T':[20.2, 19.119, 18.1]
        })

print(df1)

df2["sr"] = df2["W"].apply(lambda x: df1[x].sub(df2['T']).abs().idxmin())
df2["Pos"] = df2["W"].apply(lambda x: df1[x].sub(df2['T']).abs().idxmin())

print(df2)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一个完成这项工作的管道。总之,诀窍是先melt df1,然后merge 两个数据帧,并使用值的差异来获得最接近的匹配。其余大部分用于格式化。

    (df2.merge((df1.rename_axis('df1_Pos')          # reshape df1 to long format
                   .reset_index()                   #
                   .melt(id_vars=['df1_Pos', 'Sr'], #
                         var_name='W',              #
                         value_name='T')            #
               ),
               on=['W'],                            # merge with df2 on "W"
               suffixes=['', '1'])
        .assign(diff=lambda d: abs(d['T']-d['T1'])) # compute the diff of "T"
        .rename(columns={'T1': 'df1Closest_Val',
                         'Sr': 'df1_Sr'})
        .sort_values(by='diff')                     # sort diff to have min diff first
        .drop('diff', axis=1)
        .groupby('W').first()                       # keep first row per group (= min diff)
        .reset_index()
    )
    

    输出:

        W       T  df1_Pos  df1_Sr  df1Closest_Val
    0  W1  20.200        0    1000          20.100
    1  W2  19.119        2    1004          19.115
    2  W3  18.100        3    1009          18.000
    

    故障

    重塑 df1:

    >>> df1b = df1.reset_index().melt(id_vars=['index', 'Sr'], var_name='W', value_name='T')
    >>> df1b
    
        index    Sr   W       T
    0       0  1000  W1  20.100
    1       1  1002  W1  20.300
    2       2  1004  W1  19.100
    3       3  1009  W1  18.500
    4       0  1000  W2  45.155
    5       1  1002  W2  45.180
    6       2  1004  W2  19.115
    7       3  1009  W2  19.126
    8       0  1000  W3  20.000
    9       1  1002  W3  22.000
    10      2  1004  W3  19.000
    11      3  1009  W3  18.000
    

    合并:

    >>> df2b = df2.merge(df1b, on=['W'], suffixes=['', '1']).assign(diff=lambda d: abs(d['T']-d['T1']))
    >>> df2b
    
         W       T  index    Sr      T1    diff
    0   W1  20.200      0  1000  20.100   0.100
    1   W1  20.200      1  1002  20.300   0.100
    2   W1  20.200      2  1004  19.100   1.100
    3   W1  20.200      3  1009  18.500   1.700
    4   W2  19.119      0  1000  45.155  26.036
    5   W2  19.119      1  1002  45.180  26.061
    6   W2  19.119      2  1004  19.115   0.004
    7   W2  19.119      3  1009  19.126   0.007
    8   W3  18.100      0  1000  20.000   1.900
    9   W3  18.100      1  1002  22.000   3.900
    10  W3  18.100      2  1004  19.000   0.900
    11  W3  18.100      3  1009  18.000   0.100
    

    对值进行排序、分组并取最小差异:

    >>> df2b.sort_values(by='diff').groupby('W').first().reset_index()
    
        W       T  index    Sr      T1   diff
    0  W1  20.200      0  1000  20.100  0.100
    1  W2  19.119      2  1004  19.115  0.004
    2  W3  18.100      3  1009  18.000  0.100
    

    【讨论】:

    • 有点难理解,能否请您简化一下并发布所有代码,因为我在运行它时遇到错误。
    • @OO7 我提供了 3 个主要步骤的细分
    猜你喜欢
    • 2020-02-23
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多