Python 根据索引值从两个数据帧中减去行

Python 根据索引值从两个数据帧中减去行,python,pandas,Python,Pandas,我有两个数据帧: df1 = pd.DataFrame({ 'Name' : ['A', 'A', 'A', 'A', 'B', 'B'], 'Value': [10, 9, 8, 10, 99 , 88], 'Day' : [1,2,3,4,1,2] }) df2 = pd.DataFrame({ 'Name' : ['C', 'C', 'C', 'C'], 'Value': [1,2,3,4], 'Day' : [1,2,3,4] }) 我

我有两个数据帧:

df1 = pd.DataFrame({
    'Name' : ['A', 'A', 'A', 'A', 'B', 'B'],
    'Value': [10, 9, 8, 10, 99 , 88],
    'Day' : [1,2,3,4,1,2]
})

df2 = pd.DataFrame({
    'Name' : ['C', 'C', 'C', 'C'],
    'Value': [1,2,3,4],
    'Day' : [1,2,3,4]
})
我想根据日期将
df1
中的值与
df2
中的值相减,并创建一个名为
delta_值
的新数据框。如果当天没有条目,则不应执行任何操作

为了进一步解释:
B
在name列中仅包含第1天和第2天的值
df2
应使用
B
在第1天和第2天的值减去与第1天和第2天相关的值,但由于
B
在第3天和第4天没有值,因此不应进行算术运算。这部分我有问题

我正在寻找的输出是


如果没有比这更好的方法出现在某人的脑海中,这里有一个正确但不太优雅的解决方案:

results = df1.set_index(['Day','Name']).unstack()['Value']\
             .subtract(df2.set_index('Day')['Value'], axis=0)\
             .stack().reset_index()
delta_values = df1.copy()
delta_values['Value'] -= delta_values['Day'].map(df2.set_index('Day')['Value']
                                                ).fillna(0)
使结果看起来像预期的输出:

result.columns = 'Day', 'Name', 'Value'
result.Value = result.Value.astype(int)
result.sort_values(['Name', 'Day'], inplace=True)
result = result[['Name', 'Value', 'Day']]

我们可以合并
Day
列上的两个数据帧,然后从中减去

merged = df1.merge(df2, how='inner', on='Day', suffixes=('', '_y'))

print(merged)

  Name  Value  Day Name_y  Value_y
0    A     10    1      C        1
1    A      9    2      C        2
2    A      8    3      C        3
3    A     10    4      C        4
4    B     99    1      C        1
5    B     88    2      C        2

delta_values = df1.copy()
delta_values['Value'] = merged['Value'] - merged['Value_y']
print(delta_values)

  Name  Value  Day
0    A      9    1
1    A      7    2
2    A      5    3
3    A      6    4
4    B     98    1
5    B     86    2

您可以使用
映射
合并
。下面是一个
地图
解决方案:

results = df1.set_index(['Day','Name']).unstack()['Value']\
             .subtract(df2.set_index('Day')['Value'], axis=0)\
             .stack().reset_index()
delta_values = df1.copy()
delta_values['Value'] -= delta_values['Day'].map(df2.set_index('Day')['Value']
                                                ).fillna(0)
输出:

  Name  Value  Day
0    A      9    1
1    A      7    2
2    A      5    3
3    A      6    4
4    B     98    1
5    B     86    2

除非绝对必要,否则请不要以图像形式共享信息。见:。