Python 基于组合并数据帧
我正在尝试将两个不同的数据帧合并成一个已排序的数据帧 我的输入文件可以这样表示:Python 基于组合并数据帧,python,pandas,dataframe,merge,group-by,Python,Pandas,Dataframe,Merge,Group By,我正在尝试将两个不同的数据帧合并成一个已排序的数据帧 我的输入文件可以这样表示: 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
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)
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
列中的键代表不同的组,因此对于每个组,我希望将它们与路线距离完全连接在一起,因此结果应如下所示:
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)
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)
但结果遗漏了一些关键价值:
因此,我的问题是,如何添加缺少的键值?要解决您最初的问题,您可以使用pd.Series.ffill: 作为替代方法,您可以使用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
ffill操作错误地填写了总线的键A601@cᴏʟᴅsᴘᴇᴇᴅ 谢谢,按排序顺序填充值是非常棒的,但是如果df1更改为'key':['A','A','A'],'bus_code':['601','602','604'],那么它将错误地在key A中填充bus605@Ethan编辑后,我现在在每个小组内填写。