我有两个数据框。我想将列值从一个数据框添加到另一个数据框,而不更改其他列。
import pandas as pd
import numpy as np
dff1 = pd.DataFrame({'Date':[20160501,20160501,20160501,20160501,20160502,20160502],
'Time':['0900','0905','0910','0915','0920','0925'],
'SKU':[1,2,3,4,5,6],
'Demand':[10,35,20,15,5,55],
'Supply':[10,20,15,20,0,45]}
,columns=['Date', 'Time','SKU', 'Demand', 'Supply'])
dff1 = dff1.set_index(['Date', 'Time']);
dff2 = pd.DataFrame({'Date':[20160501,20160501,20160501,20160501,20160502,20160502,20160503],
'Time':['0900','0902','0910','0915','0920','0925','0900'],
'SKU':[1,2,3,4,5,6,7],
'Demand':[10,35,20,15,5,55,60],
'Supply':[10,20,15,20,0,45,50]}
,columns=['Date', 'Time','SKU', 'Demand', 'Supply'])
dff2 = dff2.set_index(['Date', 'Time']);
dff3 = dff1.add(dff2, fill_value=0)
dff3.reset_index()
第一个数据框的日期为日期:20160501,时间:0905,第二个数据框没有该日期的时间,但具有日期 :20160501和时间:0902。因此,挑战在于将丢失的日期/时间记录从一个数据帧添加到另一个数据帧,如果已有记录,则将 SKU 列中的值求和。无需更改其他列。
第一:
SKU Demand Supply
Date Time
20160501 0900 1 10 10
0905 2 35 20
0910 3 20 15
0915 4 15 20
20160502 0920 5 5 0
0925 6 55 45
第二:
SKU Demand Supply
Date Time
20160501 0900 1 10 10
0902 2 35 20
0910 3 20 15
0915 4 15 20
20160502 0920 5 5 0
0925 6 55 45
20160503 0900 7 60 50
所需的输出:
SKU Demand Supply
Date Time
20160501 0900 2.0 10.0 10.0
0902 2.0 35.0 20.0
0905 2.0 35.0 20.0
0910 6.0 20.0 15.0
0915 8.0 15.0 20.0
20160502 0920 10.0 5.0 0.0
0925 12.0 55.0 45.0
20160503 0900 7.0 60.0 50.0
我的输出:
SKU Demand Supply
Date Time
20160501 0900 2.0 20.0 20.0
0902 2.0 35.0 20.0
0905 2.0 35.0 20.0
0910 6.0 40.0 30.0
0915 8.0 30.0 40.0
20160502 0920 10.0 10.0 0.0
0925 12.0 110.0 90.0
20160503 0900 7.0 60.0 50.0
问题:“需求”和“供应”列也进行了求和。
更新: 经过一夜不眠,我达到了预期的结果:
dff31 = pd.merge(dff1, dff2, how='outer', on=['Date', 'Time'])
dff31.fillna(-1,inplace=True)
dff31['SKU']=dff31['SKU_x']+dff31['SKU_y']
dff31['Demand']=dff31['Demand_x']
dff31['Supply']=dff31['Supply_x']
#dff['Supply']=dff['Supply_x']
for x in range(len(dff31['Demand_x'])):
a = dff31['Demand_x'][x]
b = dff31['Demand_y'][x]
if (a > 0):
dff31['Demand'][x]=a
else:
dff31['Demand'][x]=b
c = dff31['Supply_x'][x]
d = dff31['Supply_y'][x]
if (c > 0):
dff31['Supply'][x]=a
else:
dff31['Supply'][x]=b
dff31 = dff31.drop(columns=['SKU_x','Demand_x','Supply_x','SKU_y','Demand_y','Supply_y'])
但是我相信这实际上不是“ pythonic”方式。仍然希望有人能帮助我!