Python 如何合并两个大小不等的数据帧
我有一个数据框,有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)”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”==元组中的第一个条目,然后一次更新一
将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的内容)现在是:
你为我节省了很多时间。在我使用的第一种方法中,更新数十万行有时需要几个小时,但在您的方法中,瓶颈完全消失了,我只需几分钟就完成了。非常感谢你