根据组合并DataFrame

时间:2017-08-28 15:08:49

标签: python pandas dataframe merge group-by

我正在尝试将两个不同的DataFrame合并为一个排序的。

我的输入文件可以这样表示:

  if @user_notification.save
...
  else
    format.html { render action: "index" }
    puts "full messages: #{@user_notification.errors.full_messages}"
    format.json { render json: @user_notification.errors, status: :unprocessable_entity }
    format.js { render json: { errors: @user_notification.errors, success: false }, content_type: 'application/json' }
  end
列中的

import pandas as pd rng = pd.date_range('05:37', periods= 5, freq='5Min') df1 = pd.DataFrame({'key':['A','A','A','B','B'],'bus_code':['601','602','605','602','606'], 'time': rng}) df2 = pd.DataFrame({'bus_code':['601','602','603','604','605'],'distance':['0.1','0.5','1.2','1.9','2.5']}) print(df1) print(df2) 代表不同的组,因此对于每个组,我想将它们与路径距离完全连接在一起,因此结果应该是这样的:

key

以下是我为实现这一目标所做的工作:

     bus_code key   time      distance
0      601    A   05:37:00      0.1
1      602    A   05:42:00      0.5
2      603    A        NaT      1.2
3      604    A        NaT      1.9
4      605    A   05:47:00      2.5

0      601    B        NaT      0.1
1      602    B   05:52:00      0.5   
2      603    B        NaT      1.2
3      604    B        NaT      1.9
4      605    B        NaT      2.5
5      606    B   05:57:00      NaN

但结果错过了一些new_df = pd.DataFrame() for name, group in df1.groupby('key'): # print(group) new_df = new_df.append(pd.merge(group, df2, left_on='bus_code', right_on='bus_code', how='outer').sort_values('distance')) print(new_df) 值:

key

所以这是我的问题,如何添加缺少的 bus_code key time distance 0 601 A 05:37:00 0.1 1 602 A 05:42:00 0.5 2 605 A 05:47:00 2.5 3 603 NaN NaT 1.2 4 604 NaN NaT 1.9 0 602 B 05:52:00 0.5 1 601 NaN NaT 0.1 2 603 NaN NaT 1.2 3 604 NaN NaT 1.9 4 605 NaN NaT 2.5 5 606 B 05:57:00 NaN 值?

1 个答案:

答案 0 :(得分:1)

要解决原始问题,您可以使用pd.Series.ffill

df.key.ffill(inplace=True)
print(df)

   bus_code key      time  distance
0       601   A  05:37:00       0.1
1       602   A  05:42:00       0.5
2       605   A  05:47:00       2.5
3       603   A       NaT       1.2
4       604   A       NaT       1.9
0       602   B  05:52:00       0.5
1       601   B       NaT       0.1
2       603   B       NaT       1.2
3       604   B       NaT       1.9
4       605   B       NaT       2.5
5       606   B  05:57:00       NaN

作为替代方法,您可以改为使用groupbyapply操作:

g = df1.groupby('key', as_index=False)\
              .apply(lambda x: x.merge(df2, on='bus_code', how='outer')\
              .sort_values(['bus_code', 'key'])\
              .set_index(['bus_code', 'time', 'distance']).bfill().reset_index())
       .reset_index(drop=1)   

print(g)

   bus_code                time distance key
0       601 2017-08-28 05:37:00      0.1   A
1       602 2017-08-28 05:42:00      0.5   A
2       603                 NaT      1.2   A
3       604                 NaT      1.9   A
4       605 2017-08-28 05:47:00      2.5   A
5       601                 NaT      0.1   B
6       602 2017-08-28 05:52:00      0.5   B
7       603                 NaT      1.2   B
8       604                 NaT      1.9   B
9       605                 NaT      2.5   B
10      606 2017-08-28 05:57:00      NaN   B