如何合并两个大小不相等的数据框

时间:2020-03-11 13:26:13

标签: python pandas dataframe

我有一个包含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)”

for trio in slow_TUP:
    g = pair[0]
    w = pair[1]
    z = pair[2]
    df['D'].loc[df['C'] == g] = w
    df['E'].loc[df['C'] == g] = z

2 个答案:

答案 0 :(得分:1)

为了便于阅读,我限制了列数 在第一个DataFrame( 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

具有要更新数据( dfUpd )的另一个DataFrame包含:

    C    D    E
0  c2  DD2  EE2
1  c4  DD4  EE4

因此具有 C = c2 c4 的行应进行更新。

为此,首先将 df 中的索引设置为 C 并将其保存 在一个临时的DataFrame中:

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

然后执行实际更新(现在就地,仍在 df2 中),运行:

df2.update(dfUpd.set_index('C'))

再次打印 df2 时,结果为:

     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 的内容)现在为:

    A   B   C    D    E
0  a1  b1  c1   d1   e1
1  a2  b2  c2  DD2  EE2
2  a3  b3  c3   d3   e3
3  a4  b4  c4  DD4  EE4
4  a5  b5  c5   d5   e5

答案 1 :(得分:0)

将df,df2视为两个数据帧:您可以轻松做到:

df = df.set_index('C')
df2 = df2.set_index('C')

然后:

df.loc[df2.index, df2.columns] = df2

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

示例:

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