我正在尝试将两个不同的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
值?
答案 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
作为替代方法,您可以改为使用groupby
和apply
操作:
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