Python 熊猫用现有值和其他值的总和更新一个数据帧

Python 熊猫用现有值和其他值的总和更新一个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我的实际数据帧有超过一百万行,但多索引数据帧的示例如下所示(为简单起见,1.0为IN_值): 通过这样的计算,我得到了另一个数据帧: # INDEX MATCH IN_VALUE # 0 6 -0.33 # 1 6 -0.66 当索引列和匹配列相同时,我尝试对IN_值列求和,用新的IN_值更新第一个数据帧 上面的示例输出: # INDEX ID | MATCH IN_VALUE OUT_VALUE # 0 7 | 1

我的实际数据帧有超过一百万行,但多索引数据帧的示例如下所示(为简单起见,1.0为IN_值):

通过这样的计算,我得到了另一个数据帧:

# INDEX  MATCH  IN_VALUE
# 0      6      -0.33
# 1      6      -0.66
当索引列和匹配列相同时,我尝试对IN_值列求和,用新的IN_值更新第一个数据帧

上面的示例输出:

# INDEX  ID  | MATCH  IN_VALUE  OUT_VALUE
# 0      7   | 1      1.0      -0.33
#        8   | 6      0.67       0.0
#        10  | 0      1.0      -0.54
#        11  | 6      0.67       0.0
# 1      7   | 1      1.0      -0.15
#        8   | 6      0.34       0.0
#        10  | 0      1.0      -0.54
#        11  | 6      0.34     -0.54
请注意,在第一个数据帧中有几个ID行可以应用更改。在本例中为8和11

我可以重置索引,然后在两个数据帧上将其设置为
['index',MATCH']
,以使用
update()
命令,这接近我想要的。但是,我不想简单地用第二个数据帧覆盖第一个数据帧,因此它不太起作用

此外,我还发现了许多其他的可能性,但似乎没有什么可以明确地应用于原始数据帧中的多行


如何在保持大数据帧速度的同时使用pandas实现这一点?

重置
df1
的索引,并使用
left
df1
与列
index
MATCH
上的
df2
合并
,最后,使用将此值赋回到值中的列

df3 = df1.reset_index().merge(
    df2, on=['INDEX', 'MATCH'], how='left', suffixes=['', '_r'])
    
df3 = df3.assign(IN_VALUE=df3['IN_VALUE'].add(
    df3.pop('IN_VALUE_r'), fill_value=0)).set_index(['INDEX', 'ID'])
结果:

print(df3)
          MATCH  IN_VALUE  OUT_VALUE
INDEX ID                            
0     7       1      1.00      -0.33
      8       6      0.67       0.00
      10      0      1.00      -0.54
      11      6      0.67       0.00
1     7       1      1.00      -0.15
      8       6      0.34       0.00
      10      0      1.00      -0.54
      11      6      0.34      -0.54

重置
df1
的索引,并在
index
MATCH
列上使用
left
df1
df2
合并,然后使用从右数据框将
IN_值添加到
IN_值
,最后使用将该值分配回
IN_值中的列:

df3 = df1.reset_index().merge(
    df2, on=['INDEX', 'MATCH'], how='left', suffixes=['', '_r'])
    
df3 = df3.assign(IN_VALUE=df3['IN_VALUE'].add(
    df3.pop('IN_VALUE_r'), fill_value=0)).set_index(['INDEX', 'ID'])
结果:

print(df3)
          MATCH  IN_VALUE  OUT_VALUE
INDEX ID                            
0     7       1      1.00      -0.33
      8       6      0.67       0.00
      10      0      1.00      -0.54
      11      6      0.67       0.00
1     7       1      1.00      -0.15
      8       6      0.34       0.00
      10      0      1.00      -0.54
      11      6      0.34      -0.54
这应该做到:

import pandas as pd

#data for df1
d1 = {'INDEX':[0, 0, 0, 0, 1, 1, 1, 1], 'ID':[7, 8, 10, 11, 7, 8, 10, 11],
 'MATCH':[1, 6, 0, 6, 1, 6, 0, 6], 'IN_VALUE':[1, 1, 1, 1, 1, 1, 1, 1],
 'OUT_VALUE':[-0.33, 0.0, -0.54, 0.0, -0.15, 0.0, -0.54, -0.54]}

#data for df2
d2 = {'MATCH':[6, 6], 'IN_VALUE':[-0.33, -0.66]}

#create dataframes
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)

#reset index
df1 = df1.reset_index()
df2 = df2.reset_index()

#merge df2 to df1
df3 = df1.merge(df2, how='left', left_on=['INDEX', 'MATCH'], right_on=['index', 'MATCH'])

#sum IN_VALUEs for matches
df3['IN_VALUE_x'].loc[df3['IN_VALUE_y'].notnull()] = df3['IN_VALUE_x'] + df3['IN_VALUE_y']

#rename inValues  
df3 = df3.rename(columns={'IN_VALUE_x': 'IN_VALUE'})
#keep needed columns
df3 = df3[['INDEX', 'ID', 'MATCH', 'IN_VALUE', 'OUT_VALUE']]
#re-index
df3 = df3.set_index(['INDEX', 'ID'])
print(df3)

          MATCH  IN_VALUE  OUT_VALUE
INDEX ID                            
0     7       1      1.00      -0.33
      8       6      0.67       0.00
      10      0      1.00      -0.54
      11      6      0.67       0.00
1     7       1      1.00      -0.15
      8       6      0.34       0.00
      10      0      1.00      -0.54
      11      6      0.34      -0.54
这应该做到:

import pandas as pd

#data for df1
d1 = {'INDEX':[0, 0, 0, 0, 1, 1, 1, 1], 'ID':[7, 8, 10, 11, 7, 8, 10, 11],
 'MATCH':[1, 6, 0, 6, 1, 6, 0, 6], 'IN_VALUE':[1, 1, 1, 1, 1, 1, 1, 1],
 'OUT_VALUE':[-0.33, 0.0, -0.54, 0.0, -0.15, 0.0, -0.54, -0.54]}

#data for df2
d2 = {'MATCH':[6, 6], 'IN_VALUE':[-0.33, -0.66]}

#create dataframes
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)

#reset index
df1 = df1.reset_index()
df2 = df2.reset_index()

#merge df2 to df1
df3 = df1.merge(df2, how='left', left_on=['INDEX', 'MATCH'], right_on=['index', 'MATCH'])

#sum IN_VALUEs for matches
df3['IN_VALUE_x'].loc[df3['IN_VALUE_y'].notnull()] = df3['IN_VALUE_x'] + df3['IN_VALUE_y']

#rename inValues  
df3 = df3.rename(columns={'IN_VALUE_x': 'IN_VALUE'})
#keep needed columns
df3 = df3[['INDEX', 'ID', 'MATCH', 'IN_VALUE', 'OUT_VALUE']]
#re-index
df3 = df3.set_index(['INDEX', 'ID'])
print(df3)

          MATCH  IN_VALUE  OUT_VALUE
INDEX ID                            
0     7       1      1.00      -0.33
      8       6      0.67       0.00
      10      0      1.00      -0.54
      11      6      0.67       0.00
1     7       1      1.00      -0.15
      8       6      0.34       0.00
      10      0      1.00      -0.54
      11      6      0.34      -0.54

@这回答了你的问题吗?@DoubleDouble这回答了你的问题吗?