Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于组合并数据帧_Python_Pandas_Dataframe_Merge_Group By - Fatal编程技术网

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编辑后,我现在在每个小组内填写。