我有一个包含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
答案 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 仍然是索引。
因此,要完成任务,您应该:
所有这些操作都可以在一条指令中执行:
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