假设我有一个主数据框
main_df
Cri1 Cri2 Cr3 total
0 A1 A2 A3 4
1 B1 B2 B3 5
2 C1 C2 C3 6
我也有3个数据框
df_1
Cri1 Cri2 Cri3 value
0 A1 A2 A3 1
1 B1 B2 B3 2
df_2
Cri1 Cri2 Cri3 value
0 A1 A2 A3 9
1 C1 C2 C3 10
df_3
Cri1 Cri2 Cri3 value
0 B1 B2 B3 15
1 C1 C2 C3 17
我想要的是根据Cri的规定,将每个框架df
的值加到main_df
的总数中
即main_df将变为
main_df
Cri1 Cri2 Cri3 total
0 A1 A2 A3 14
1 B1 B2 B3 22
2 C1 C2 C3 33
我当然可以使用for循环来做到这一点,但是最后我想将该方法应用于大量数据,例如每个数据帧中有50000行。
还有其他解决方法吗?
谢谢!
答案 0 :(得分:1)
首先,您应该对齐数字列名称。在这种情况下:
df_main = df_main.rename(columns={'total': 'value'})
然后您有几个选择。
您可以将groupby
与sum
串联,然后执行:
res = pd.concat([df_main, df_1, df_2, df_3])\
.groupby(['Cri1', 'Cri2', 'Cri3']).sum()\
.reset_index()
print(res)
Cri1 Cri2 Cri3 value
0 A1 A2 A3 14
1 B1 B2 B3 22
2 C1 C2 C3 33
或者,您可以创建由条件列索引的数据框列表。然后将functools.reduce
与pd.DataFrame.add
结合使用以对这些数据帧求和。
from functools import reduce
dfs = [df.set_index(['Cri1', 'Cri2', 'Cri3']) for df in [df_main, df_1, df_2, df_3]]
res = reduce(lambda x, y: x.add(y, fill_value=0), dfs).reset_index()
print(res)
Cri1 Cri2 Cri3 value
0 A1 A2 A3 14.0
1 B1 B2 B3 22.0
2 C1 C2 C3 33.0