2017-07-21 54 views
2

我想合并两个数据帧。让我们考虑以下两个DFS:合并两个具有复杂条件的熊猫数据帧

DF1:

id_A,   ts_A, course,  weight 
id1, 2017-04-27 01:35:30, cotton,  3.5 
id1, 2017-04-27 01:36:05, cotton,  3.5 
id1, 2017-04-27 01:36:55, cotton,  3.5 
id1, 2017-04-27 01:37:20, cotton,  3.5 
id2, 2017-04-27 02:35:35, cotton blue, 5.0 
id2, 2017-04-27 02:36:00, cotton blue, 5.0 
id2, 2017-04-27 02:36:35, cotton blue, 5.0 
id2, 2017-04-27 02:37:20, cotton blue, 5.0 

DF2:

id_B, ts_B,     value 
id1, 2017-03-27 01:25:40, 100 
id1, 2017-03-27 01:25:50, 200 
id1, 2017-03-27 01:25:50, 230 
id1, 2017-04-27 01:35:40, 240 
id1, 2017-04-27 01:35:50, 200 
id1, 2017-04-27 01:36:00, 350 
id1, 2017-04-27 01:36:10, 400 
id1, 2017-04-27 01:36:20, 500 
id1, 2017-04-27 01:36:30, 600 
id1, 2017-04-27 01:36:40, 700 
id1, 2017-04-27 01:36:50, 800 
id1, 2017-04-27 01:37:00, 900 
id1, 2017-04-27 01:37:10, 1000 
id2, 2017-04-27 02:35:40, 1000 
id2, 2017-04-27 02:35:50, 2000 
id2, 2017-04-27 02:36:00, 4500 
id2, 2017-04-27 02:36:10, 3000 
id2, 2017-04-27 02:36:20, 6000 
id2, 2017-04-27 02:36:30, 5000 
id2, 2017-04-27 02:36:40, 5022 
id2, 2017-04-27 02:36:50, 5040 
id2, 2017-04-27 02:37:00, 3200 
id2, 2017-04-27 02:37:10, 9000 

DF1应DF2合并使得下列条件成立: 由于时间间隔的差异在df1中的两个连续行之间,我想将它与在该时间间隔内跟随的df2中所有行的平均值合并。例如,

id_A,   ts_A, course,  weight 
id1, 2017-04-27 01:35:30, cotton,  3.5 

应合并

id_B, ts_B,     value 
id1, 2017-04-27 01:35:40, 240 
id1, 2017-04-27 01:35:50, 200 
id1, 2017-04-27 01:36:00, 350 

,并获得

id_A,   ts_A, course,  weight avgValue 
id1, 2017-04-27 01:35:30, cotton,  3.5 263.3 

我想看看从另一个角度思考问题 - 这将包括DF2的缺失行成DF1 - 通过使用merge_asof但我没有得到正确的结果:

pd.merge_asof(df2_sorted, df1, left_on='ts_B', right_on='ts_A', left_by='id_B', right_by='id_A', direction='backward') 

回答

1

我想你需要merge_asof,但使用计数器reset_index每行都是唯一的价值df1

df1 = df1.reset_index(drop=True) 
print (df1.index) 
RangeIndex(start=0, stop=8, step=1) 

df = pd.merge_asof(df2_sorted, 
        df1.reset_index(), 
        left_on='ts_B', 
        right_on='ts_A', 
        left_by='id_B', 
        right_by='id_A') 

然后通过输出列GROUPBY和聚合mean(用于index列不要忘记):

df = df.groupby(['id_A','ts_A', 'course', 'weight', 'index'], as_index=False)['value'] 
     .mean() 
     .drop('index', axis=1) 
print (df) 
    id_A    ts_A  course weight  value 
0 id1 2017-04-27 01:35:30  cotton  3.5 263.333333 
1 id1 2017-04-27 01:36:05  cotton  3.5 600.000000 
2 id1 2017-04-27 01:36:55  cotton  3.5 950.000000 
3 id2 2017-04-27 02:35:35 cotton blue  5.0 1500.000000 
4 id2 2017-04-27 02:36:00 cotton blue  5.0 4625.000000 
5 id2 2017-04-27 02:36:35 cotton blue  5.0 5565.500000 
+0

非常感谢。我正在将其应用于我的案例。几分钟,我回来了。 –

+0

没问题,仔细检查;) – jezrael

+0

执行df = df.groupby(schema2,as_index = False)['value']。mean().drop('index',axis = 1)时出现以下错误raise DataError ('没有数字类型来聚合') pandas.core.base.DataError:没有数字类型来聚合 –