Pandas - 根据某些条件从Dataframe列表创建Dataframe

时间:2018-01-03 17:28:20

标签: python pandas dataframe

我有一个数据框列表。该列表可能包含3个或更多数据帧。每个数据帧中的行数可以彼此不同。数据框看起来如下。

https://wiki.jenkins.io/display/JENKINS/Next+Build+Number+Plugin

我必须遍历列表并根据以下条件从这些列表中创建一个数据帧。

  • 如果两个数据帧的 Line Point 都匹配,请创建一个新的 Res 列,其值为 Res 第二个数据帧;第二个数据帧的 Res 的值插入同一行。
  • 如果两个数据帧的 Line Point 都不匹配,请插入一个新行,其中第二个数据帧的值为 Res 新的 Res 列。

对于上面提到的示例数据帧,结果数据帧应如下所示:

enter image description here

我尝试过合并等,但我无法在Pandas中做到这一点。请帮我解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

数据输入:

df1=pd.DataFrame({'Line':[1,1,1],'Point':[2,3,4],'Res':[1,2,3]})

df2=pd.DataFrame({'Line':[1,2,3],'Point':[2,3,4],'Res':[1,2,3]})

df3=pd.DataFrame({'Line':[3,3,3],'Point':[4,3,4],'Res':[1,2,3]})

我们使用reduce merge outer

l=[df1,df2,df3]

import functools


functools.reduce(lambda left,right: pd.merge(left,right,on=['Line','Point'],how='outer'), l)
Out[228]: 
   Line  Point  Res_x  Res_y  Res
0     1      2    1.0    1.0  NaN
1     1      3    2.0    NaN  NaN
2     1      4    3.0    NaN  NaN
3     2      3    NaN    2.0  NaN
4     3      4    NaN    3.0  1.0
5     3      4    NaN    3.0  3.0
6     3      3    NaN    NaN  2.0

答案 1 :(得分:1)

使用Wen的数据,首先使用pd.concat执行连接,然后使用groupby重新连接。

df_list = [df1, df2, df3]

i = [df.rename(columns={'Res' : 'Res{}'.format(i)}) for i, df in enumerate(df_list, 1)]

df = pd.concat(df_list)\
       .groupby(['Line', 'Point'], sort=False)\
       .max()\
       .reset_index()

df

   Line  Point  Res1  Res2  Res3
0     1      2   1.0   1.0   NaN
1     1      3   2.0   NaN   NaN
2     1      4   3.0   NaN   NaN
3     2      3   NaN   2.0   NaN
4     3      4   NaN   3.0   3.0
5     3      3   NaN   NaN   2.0