Python 熊猫用现有值和其他值的总和更新一个数据帧
我的实际数据帧有超过一百万行,但多索引数据帧的示例如下所示(为简单起见,1.0为IN_值): 通过这样的计算,我得到了另一个数据帧: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
# 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这回答了你的问题吗?