I have this dataframe as an example
import pandas as pd
#create dataframe
df = pd.DataFrame([['DE', 'Table',201705,201705, 1000], ['DE', 'Table',201705,201704, 1000],\
['DE', 'Table',201705,201702, 1000], ['DE', 'Table',201705,201701, 1000],\
['AT', 'Table',201708,201708, 1000], ['AT', 'Table',201708,201706, 1000],\
['AT', 'Table',201708,201705, 1000], ['AT', 'Table',201708,201704, 1000]],\
columns=['ISO','Product','Billed Week', 'Created Week', 'Billings'])
print (df)
ISO Product Billed Week Created Week Billings
0 DE Table 201705 201705 1000
1 DE Table 201705 201704 1000
2 DE Table 201705 201702 1000
3 DE Table 201705 201701 1000
4 AT Table 201708 201708 1000
5 AT Table 201708 201706 1000
6 AT Table 201708 201705 1000
7 AT Table 201708 201704 1000
What I need to do is fill in some missing data with a 0 Billings for each groupby['ISO','Product'] where there is a break in the sequence i.e. no billings were created in a certain week so it is missing. It needs to be based on the maximum of Billed Week and Minimum of Created Week. ie that is the combinations that should be complete with no break in sequence.
So for the above, the missing records i need to programmatically append into the database are shown below:
ISO Product Billed Week Created Week Billings
0 DE Table 201705 201703 0
1 AT Table 201708 201707 0
Here is my solution.I believe some genius will provide better solution~ Let us waiting for it ~
df1=df.groupby('ISO').agg({'Billed Week' : np.max,'Created Week' : np.min})
df1['ISO']=df1.index
Created Week Billed Week ISO
ISO
AT 201704 201708 AT
DE 201701 201705 DE
ISO=[]
BilledWeek=[]
CreateWeek=[]
for i in range(len(df1)):
BilledWeek.extend([df1.ix[i,1]]*(df1.ix[i,1]-df1.ix[i,0]+1))
CreateWeek.extend(list(range(df1.ix[i,0],df1.ix[i,1]+1)))
ISO.extend([df1.ix[i,2]]*(df1.ix[i,1]-df1.ix[i,0]+1))
DF=pd.DataFrame({'BilledWeek':BilledWeek,'CreateWeek':CreateWeek,'ISO':ISO})
Target=DF.merge(df,left_on=['BilledWeek','CreateWeek','ISO'],right_on=['Billed Week','Created Week','ISO'],how='left')
Target.Billings.fillna(0,inplace=True)
Target=Target.drop(['Billed Week', 'Created Week'],axis=1)
Target['Product']=Target.groupby('ISO')['Product'].ffill()
Out[75]:
BilledWeek CreateWeek ISO Product Billings
0 201708 201704 AT Table 1000.0
1 201708 201705 AT Table 1000.0
2 201708 201706 AT Table 1000.0
3 201708 201707 AT Table 0.0
4 201708 201708 AT Table 1000.0
5 201705 201701 DE Table 1000.0
6 201705 201702 DE Table 1000.0
7 201705 201703 DE Table 0.0
8 201705 201704 DE Table 1000.0
9 201705 201705 DE Table 1000.0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With