如何以最有效的方式将多个数据帧合并为一个原始数据帧?

2024-05-19 15:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

如何以最有效的方式将4个数据帧合并为一个原始数据帧? 下面显示了原始数据帧df,其4列CC1CC2CC3CC4需要使用df1df2df3df4中的相应列进行更新

所有数据帧的公共列是TDPD

编辑

df

TD   PD  CC1    CC2    CC3    CC4    A     B     C
10   1   Null   Null   Null   Null   1     1     0
10   2   Null   Null   Null   Null   0     1     1
10   3   Null   Null   Null   Null   Null  2     Null
20   1   Null   Null   Null   Null   Null  0     1
20   4   Null   Null   Null   Null   2     Null  Null
30   1   Null   Null   Null   Null   4     0     2
30   3   Null   Null   Null   Null   8     Null  5
30   5   Null   Null   Null   Null   Null  1     1
40   2   Null   Null   Null   Null   0     0     0

df1

TD   PD   CC1
10   2     0
20   1     5
20   4     2
30   3    10

df2

TD   PD   CC2
10   1     15
10   2     10
20   4     20

df3

TD   PD   CC3
10   3     0
20   4     5
30   1     9

df4

TD   PD   CC4
20   4     0
30   1     15
30   3     20

合并后的预期输出如下所示:

df

TD   PD  CC1    CC2    CC3    CC4   A      B     C
10   1   Null   15    Null   Null   1      1     0
10   2    0     10    Null   Null   0      1     1
10   3   Null  Null    0     Null   Null   2     Null
20   1    5    Null   Null   Null   Null   0     1
20   4    2     20     5      0     2      Null  Null
30   1   Null  Null    9      15    4      0     2
30   3    10   Null   Null    20    8      Null  5
30   5   Null   Null   Null  Null   Null   1     1
40   2   Null   Null   Null  Null   0      0     0

这里dfABC)中的其他额外列不受影响。 此外,df1、df2、df3和df4中的总行数不等于df中的行数。如何以最快的方式实现这一点,可以在一个语句中完成,或者在这里使用4个不同的语句

非常感谢您的帮助。非常感谢


Tags: 数据df原始数据方式nulltdpddf1
1条回答
网友
1楼 · 发布于 2024-05-19 15:39:36

在列表理解中使用^{}通过TD创建MultiIndexPD通过^{}进行外部连接,然后使用^{}MultiIndex创建到列:

dfs = [df1, df2, df3, df4]
dfnew = pd.concat([x.set_index(['TD', 'PD']) for x in dfs], axis=1).reset_index()
print (dfnew)
   TD  PD   CC1   CC2  CC3   CC4
0  10   1   NaN  15.0  NaN   NaN
1  10   2   0.0  10.0  NaN   NaN
2  10   3   NaN   NaN  0.0   NaN
3  20   1   5.0   NaN  NaN   NaN
4  20   4   2.0  20.0  5.0   0.0
5  30   1   NaN   NaN  9.0  15.0
6  30   3  10.0   NaN  NaN  20.0


df = df.combine_first(dfnew)

编辑:错误表示组合TDPD中存在重复项

#changed data for simulate error
print (df1)
   TD  PD  CC1
0  10   2    0
1  20   4    5 <- duplicates
2  20   4    2 <- duplicates
3  20   4   10 <- duplicates

一个想法是删除重复的行,因此输出中只有第一个值:

dfs = [df1, df2, df3, df4]
dfnew = pd.concat([x.drop_duplicates(['TD','PD']).set_index(['TD', 'PD']) 
                   for x in dfs], axis=1).reset_index()
print (dfnew)
   TD  PD  CC1   CC2  CC3   CC4
0  10   1  NaN  15.0  NaN   NaN
1  10   2  0.0  10.0  NaN   NaN
2  10   3  NaN   NaN  0.0   NaN
3  20   4  5.0  20.0  5.0   0.0 <- first value 5
4  30   1  NaN   NaN  9.0  15.0
5  30   3  NaN   NaN  NaN  20.0

另一个想法是聚合的,例如通过sum

dfnew = pd.concat([x.groupby(['TD', 'PD']).sum() for x in dfs], axis=1).reset_index()
print (dfnew)
   TD  PD   CC1   CC2  CC3   CC4
0  10   1   NaN  15.0  NaN   NaN
1  10   2   0.0  10.0  NaN   NaN
2  10   3   NaN   NaN  0.0   NaN
3  20   4  17.0  20.0  5.0   0.0 <- summed values - 17
4  30   1   NaN   NaN  9.0  15.0
5  30   3   NaN   NaN  NaN  20.0

相关问题 更多 >