Python 如何合并两个大小不等的数据帧

Python 如何合并两个大小不等的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,有26列,'A'到'Z'和100行,第二个数据框有3列,'C'到'E'和30行。第一个数据帧在“D”列和“E”列中分别缺少50个条目,因此我需要做的是覆盖第一个数据帧中的“D”列和“E”列,其中第一个数据帧中的“C”为第二个数据帧中的“C” 目前,因为很容易,我将第二个数据帧存储在元组列表中,并使用for循环和许多loc批量更新第一个数据帧。不过,这需要几个小时,因为这对我的计算机来说是一个大数据帧,在每个循环中,我都会找到大数据帧的列“C”==元组中的第一个条目,然后一次更新一

我有一个数据框,有26列,'A'到'Z'和100行,第二个数据框有3列,'C'到'E'和30行。第一个数据帧在“D”列和“E”列中分别缺少50个条目,因此我需要做的是覆盖第一个数据帧中的“D”列和“E”列,其中第一个数据帧中的“C”为第二个数据帧中的“C”

目前,因为很容易,我将第二个数据帧存储在元组列表中,并使用for循环和许多loc批量更新第一个数据帧。不过,这需要几个小时,因为这对我的计算机来说是一个大数据帧,在每个循环中,我都会找到大数据帧的列“C”==元组中的第一个条目,然后一次更新一个条目

下面的代码可以工作,但速度慢得可笑。我在想我应该做的是将元组存储在一个数据帧中,并执行某种合并,但我不断得到错误“ValueError:len(right_on)必须等于len(left_on)”


将df、df2作为两个数据帧:您可以轻松地执行以下操作:

df = df.set_index('C')
df2 = df2.set_index('C')
然后:

df.loc[df2.index, df2.columns] = df2
这将在df2确实具有的列中用df2值覆盖所有df,其中
df.C==df2.C
,而不会影响其他列

例如:

df
Out[31]: 
    a      b      c  d
0  12  213.0  231.0  2
1  31    NaN    NaN  1
2  24    NaN    NaN  5
3  53    NaN    NaN  4
4  44  132.0  231.0  2
5  32  455.0  211.0  1

d2
Out[32]: 
    a    b    c
0  24  214  221
1  53  244  111

result #after using the above method
Out[33]: 
        b      c  d
a                  
12  213.0  231.0  2
31    NaN    NaN  1
24  214.0  221.0  5
53  244.0  111.0  4
44  132.0  231.0  2
32  455.0  211.0  1

为了示例的可读性,我限制了列的数量 在第一个数据帧(df)到5中

假设它包含:

    A   B   C   D   E
0  a1  b1  c1  d1  e1
1  a2  b2  c2  d2  e2
2  a3  b3  c3  d3  e3
3  a4  b4  c4  d4  e4
4  a5  b5  c5  d5  e5
    C    D    E
0  c2  DD2  EE2
1  c4  DD4  EE4
另一个包含要更新数据的数据帧(dfUpd)包含:

    A   B   C   D   E
0  a1  b1  c1  d1  e1
1  a2  b2  c2  d2  e2
2  a3  b3  c3  d3  e3
3  a4  b4  c4  d4  e4
4  a5  b5  c5  d5  e5
    C    D    E
0  c2  DD2  EE2
1  c4  DD4  EE4
因此,应该更新C=c2或c4的行

为此,首先将df中的索引设置为C并保存它 在临时数据帧中:

df2 = df.set_index('C')
结果是:

     A   B   D   E
C                 
c1  a1  b1  d1  e1
c2  a2  b2  d2  e2
c3  a3  b3  d3  e3
c4  a4  b4  d4  e4
c5  a5  b5  d5  e5
     A   B    D    E
C                   
c1  a1  b1   d1   e1
c2  a2  b2  DD2  EE2
c3  a3  b3   d3   e3
c4  a4  b4  DD4  EE4
c5  a5  b5   d5   e5
然后,要执行实际更新(目前仍在df2中),请运行:

再次打印df2时,结果是:

     A   B   D   E
C                 
c1  a1  b1  d1  e1
c2  a2  b2  d2  e2
c3  a3  b3  d3  e3
c4  a4  b4  d4  e4
c5  a5  b5  d5  e5
     A   B    D    E
C                   
c1  a1  b1   d1   e1
c2  a2  b2  DD2  EE2
c3  a3  b3   d3   e3
c4  a4  b4  DD4  EE4
c5  a5  b5   d5   e5
目前,C仍然是索引

因此,要完成任务,您应该:

  • 重置索引(但之后C列位于第一个位置)
  • 使用来自df的列重新索引列(以恢复原始 列顺序)
  • 将结果保存回df
所有这些操作都可以在一条指令中执行:

df = df2.reset_index().reindex(columns=df.columns)
结果(df的内容)现在是:


你为我节省了很多时间。在我使用的第一种方法中,更新数十万行有时需要几个小时,但在您的方法中,瓶颈完全消失了,我只需几分钟就完成了。非常感谢你