【问题标题】:How to find the best match between two pandas columns?如何找到两个熊猫列之间的最佳匹配?
【发布时间】:2019-04-30 08:59:56
【问题描述】:

假设我有两个数据框,df1 和 df2,如下所示:

df1 = pd.DataFrame({'Timestamp_A': [0.6, 1.1, 1.6, 2.1, 2.6, 3.1, 3.6, 4.1, 4.6, 5.1, 5.6, 6.1, 6.6, 7.1]})
df2 = pd.DataFrame({'Timestamp_B': [2.2, 2.7, 3.2, 3.7, 5.2, 5.7]})


Timestamp_A
0   0.6
1   1.1
2   1.6
3   2.1
4   2.6
5   3.1
6   3.6
7   4.1
8   4.6
9   5.1
10  5.6
11  6.1
12  6.6
13  7.1

Timestamp_B
0   2.2
1   2.7
2   3.2
3   3.7
4   5.2
5   5.7

每个数据帧都是不同传感器读数的输出,并且每个数据帧都以相同的频率传输。我想做的是将这两个数据帧对齐在一起,以使 B 中的每个时间戳与 A 中最接近其值的时间戳对齐。对于 Timestamp_A 中与 Timestamp_B 不匹配的所有值,将它们替换为 np.nan。有没有人对做这样的事情的最佳方法有任何建议?这是所需的输出:

    Timestamp_A     Timestamp_B
0   0.6     NaN
1   1.1     NaN
2   1.6     NaN
3   2.1     2.2
4   2.6     2.7
5   3.1     3.2
6   3.6     NaN
7   4.1     NaN
8   4.6     NaN
9   5.1     5.2
10  5.6     5.7
11  6.1     NaN
12  6.6     NaN
13  7.1     NaN

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可能想要一些merge_asof 的应用程序,如下所示:

    import pandas as pd
    
    df1 = pd.DataFrame({'Timestamp_A': [0.6, 1.1, 1.6, 2.1, 2.6, 3.1, 3.6, 4.1, 4.6, 5.1, 5.6, 6.1, 6.6, 7.1]})
    df2 = pd.DataFrame({'Timestamp_B': [2.2, 2.7, 3.2, 3.7, 5.2, 5.7]})
    
    df3 = pd.merge_asof(df1, df2, left_on='Timestamp_A', right_on='Timestamp_B',
                        tolerance=0.5, direction='nearest')
    
    print(df3)
    

    输出如下:

        Timestamp_A  Timestamp_B
    0           0.6          NaN
    1           1.1          NaN
    2           1.6          NaN
    3           2.1          2.2
    4           2.6          2.7
    5           3.1          3.2
    6           3.6          3.7
    7           4.1          3.7
    8           4.6          NaN
    9           5.1          5.2
    10          5.6          5.7
    11          6.1          5.7
    12          6.6          NaN
    13          7.1          NaN
    

    容差将在数字上定义“不匹配”的含义,因此由您决定。

    【讨论】:

    • 有趣,API 说公差只接受整数或 timedelta,所以我什至没有尝试使用它。好方法!
    • @Terry hah 我什至没看到,我只是硬着头皮冲进去并尝试了 XD,有时我猜文档会撒谎
    【解决方案2】:

    当你只有两个columns和一个赋值时,我觉得reindex更合适

    df2.index=df2.Timestamp_B
    df1['New']=df2.reindex(df1.Timestamp_A,method='nearest',tolerance=0.5).values
    df1
    Out[109]: 
        Timestamp_A  New
    0           0.6  NaN
    1           1.1  NaN
    2           1.6  NaN
    3           2.1  2.2
    4           2.6  2.7
    5           3.1  3.2
    6           3.6  3.7
    7           4.1  3.7
    8           4.6  NaN
    9           5.1  5.2
    10          5.6  5.7
    11          6.1  5.7
    12          6.6  NaN
    13          7.1  NaN
    

    更多栏目

    s=pd.DataFrame(df2.reindex(df1.Timestamp_A,method='nearest',tolerance=0.5).values,index=df1.index,columns=df2.columns)
    df1=pd.concat([df1,s],axis=1)
    

    【讨论】:

    • 抱歉,我忘了说明我正在使用的每个数据框实际上都有数百列。如果只有 2 个,那么这绝对是一个有效的解决方案。知道这当然仍然是一件好事
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2019-03-01
    相关资源
    最近更新 更多