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
除非绝对必要,否则请不要以图像形式共享信息。见:。