from ipythonblocks import BlockGrid #Here's a simple grid grid = BlockGrid(10, 10, fill=(123, 234, 123)) grid import pandas as pd df=pd.DataFrame({'group':['a','a','a','a','a','a','a','b','b','b','b','b','b','b'], 'day':['Mon','Tues','Fri','Thurs','Sat','Sun','Weds','Fri','Sun','Thurs','Sat','Weds','Mon','Tues'], 'amount':[1,2,4,2,1,1,2,4,5,3,4,2,1,3], 'value':[2.1,np.nan,3,4.4,2.5,1,np.nan,np.nan,8.2,3.2,4.1,np.nan,1.2,1.4] }) df df.shape def pBlockGrid(df): (y,x)=df.shape return BlockGrid(x,y) pBlockGrid(df) def pBlockGrid2(df,fill=(123, 234, 123),*args,**kwargs): (y,x)=df.shape b=BlockGrid(x,y,fill=fill,**kwargs) return b pb=pBlockGrid2(df) pb.block_size = 4 pb df.dtypes def pBlockGrid3(df,fill=(123, 234, 123),blocksize=10,*args,**kwargs): b=pBlockGrid2(df,fill=fill) type_colours={'int64':(255, 0, 0),'float64':(0, 0, 255),'object':(128,128,0)} for i,j in enumerate(df.dtypes): b[:, i] = type_colours[j.name] b.block_size = blocksize return b pBlockGrid3(df) def pBlock_colourNA(df,b,color_NA=(0,0,0),*args,**kwargs): (y,x)=df.shape for i in range(x): for j in range(y): if pd.isnull(df.iloc[j,i]): b[j,i]=color_NA return b def pBlockGrid4(df,fill=(123, 234, 123),*args,**kwargs): b=pBlockGrid3(df,fill=fill) b=pBlock_colourNA(df,b,*args,**kwargs) return b pBlockGrid4(df,blocksize=5) df.transpose() pBlockGrid4(df.transpose(),blocksize=5) df1=pd.DataFrame({"colA":['A','B','C','D'],"colB":np.arange(4)}) df1 df2=pd.DataFrame({"colA":['D','E','F'],"colB":np.arange(14,17)}) df2 def pBlockGrid5(df1,df2,join='outer',fill=(123, 234, 123),*args,**kwargs): df=pd.concat([df1,df2],join=join) b=pBlockGrid2(df,fill=fill) for block in b: if block.row < len(df1): block.set_colors(255,0,0) else: block.set_colors(0,0,255) b=pBlock_colourNA(df,b,*args,**kwargs) return (df,b) dfd,bb=pBlockGrid5(df1,df2) bb df3=pd.DataFrame({"colA":['F','G'],"colB":np.arange(16,18),"colC":np.arange(26,28)}) df3 dfd,bb=pBlockGrid5(df1,df3) bb b=pBlockGrid2(dfd,fill=(123, 234, 123)) pBlock_colourNA(dfd,b) def pBlockGrid6(df1,df2,fill=(123, 234, 123),*args,**kwargs): df=pd.merge(df1,df2,**kwargs) b=pBlockGrid2(df,fill=fill) for block in b: label=df.columns.tolist()[block.col] if 'on' in kwargs and label in kwargs['on']: block.set_colors(0,255,0) #This following bit assumes that the left N cols in the merged table are from the left table elif block.col < len(df1.columns): block.set_colors(255,0,0) else: block.set_colors(0,0,255) b=pBlock_colourNA(df,b) return (df,b) dfd,bb=pBlockGrid6(df2,df3,how='inner',on=['colA','colB']) print(dfd) bb dfd,bb=pBlockGrid6(df2,df3,how='left',on=['colA']) print(dfd) bb dfd,bb=pBlockGrid6(df2,df3,how='right',on=['colA']) print(dfd) bb dfd,bb=pBlockGrid6(df2,df3,how='outer',on=['colB']) print(dfd) bb