如何合并列和重复的行值以在熊猫中匹配

时间:2019-07-03 18:39:44

标签: python pandas

我想在“时间”上加入2个数据帧,但是一个df使用.25秒的间隔,而另一个使用1秒的间隔。我想将1秒间隔df的值连接到.25秒间隔df的值,并在对应的第二个值内重复这些值。

下面是我要合并的2个数据帧的小片段:

   time       speaker
   0.25        1
   0.25        2
   0.50        1
   0.50        2
   0.75        1
   0.75        2
   1.00        1
   1.00        2
   1.25        1
   1.25        2
   1.50        1
   1.50        2
   1.75        1
   1.75        2
   2.00        1
   2.00        2

和:

   time  label
    0     10
    1     11
    

我想要:

  time     speaker label
   0.25        1     10
   0.25        2     10
   0.50        1     10
   0.50        2     10
   0.75        1     10
   0.75        2     10
   1.00        1     10
   1.00        2     10
   1.25        1     11
   1.25        2     11
   1.50        1     11
   1.50        2     11
   1.75        1     11
   1.75        2     11
   2.00        1     11
   2.00        2     11

谢谢!

2 个答案:

答案 0 :(得分:2)

这里正在使用merge_asof

pd.merge_asof(df1,df2.astype(float),on='time',allow_exact_matches = False)
Out[14]: 
    time  speaker  label
0   0.25        1   10.0
1   0.25        2   10.0
2   0.50        1   10.0
3   0.50        2   10.0
4   0.75        1   10.0
5   0.75        2   10.0
6   1.00        1   10.0
7   1.00        2   10.0
8   1.25        1   11.0
9   1.25        2   11.0
10  1.50        1   11.0
11  1.50        2   11.0
12  1.75        1   11.0
13  1.75        2   11.0
14  2.00        1   11.0
15  2.00        2   11.0

答案 1 :(得分:0)

IIUC,这是pd.cut的情况:

df1['label'] = pd.cut(df1['time'], 
                      bins=list(df2['time'])+[np.inf], 
                      labels=df2['label'])

输出:

    time  speaker label
0   0.25        1    10
1   0.25        2    10
2   0.50        1    10
3   0.50        2    10
4   0.75        1    10
5   0.75        2    10
6   1.00        1    10
7   1.00        2    10
8   1.25        1    11
9   1.25        2    11
10  1.50        1    11
11  1.50        2    11
12  1.75        1    11
13  1.75        2    11
14  2.00        1    11
15  2.00        2    11