Search code examples
pythonpandaspcamat

Python Pandas Pivot image data table


I have a using Pandas dataframe I created a table that is 3000000x3 (pixels x rob bands) and am now trying to pivot it so I have a table that is 3x3000000 and then run a PCA against the new data.

I am using that pandas pivot function but cannot figure out what I am doing wrong.

import pandas as pd 
import numpy as np 
import random as rd
from sklearn.decomposition import PCA
from sklearn import preprocessing
import matplotlib.pyplot as plt
import cv2 

#read in image
img = cv2.imread('/Volumes/EXTERNAL/Stitched-Photos-for-Chris/p7_0015_20161005-949am-75m-pass-1.jpg.png',1)
row,col = img.shape[:2]
#print(row , col)

#get a unique pixel ID for each pixel
pixel = [i for i in range(0,row*col)]
data = pd.DataFrame(columns=['bBand','gBand','rBand'],index = pixel)

#populate data for each band
b,g,r = cv2.split(img)
data.loc[pixel,'bBand'] = b.flat[:]
data.loc[pixel,'gBand'] = g.flat[:]
data.loc[pixel,'rBand'] = r.flat[:]

datapivoted = data.pivot(index=['bBand','gBand','rBand'], columns=pixel, values=[data.loc[pixel,'bBand'],data.loc[pixel,'bBand'],data.loc[pixel,'bBand']])

print(data.head())
print(data.shape)

Update

Recreate the dataframe using the following code which I think is correct and more efficient but still cannot pivot

img = cv2.imread('/Volumes/EXTERNAL/Stitched-Photos-for-Chris/p7_0015_20161005-949am-75m-pass-1.jpg.png',1)
row,col = img.shape[:2]
#print(row , col)
b,g,r = cv2.split(img)

data = pd.DataFrame({'bBnad':b.flat[:],'gBnad':g.flat[:],'rBnad':r.flat[:]})

Solution

  • Was seriously overthinking the problem. As I needed to completely swap the axis it was simple as transposing using .T

    data = pd.DataFrame({'bBnad':b.flat[:],'gBnad':g.flat[:],'rBnad':r.flat[:]})
    datapivoted = data.T
    print(datapivoted.head())
    print(datapivoted.shape)