How to display image stored in pandas dataframe?

前端 未结 2 833
太阳男子
太阳男子 2021-02-10 09:53
import pandas as pd
from scipy import misc
import numpy as np
import matplotlib.pyplot as plt

W = {\'img\':[misc.imread(\'pic.jpg\')]}
df = pd.DataFrame(W)

# This disp         


        
2条回答
  •  耶瑟儿~
    2021-02-10 10:41

    How to display images in pandas dataframe

    If you have Pandas column that contains URL or local path you can generate Image column which will display thumbnail or any other image size.

    1. In case you have URLs of images in list.

    You will first need to download images based on image URLs. adImageList contains list of URL of images which you want to add to pandas as column.

    dir_base = os.getcwd() # Get your current directory
    for i, URL in enumerate(adImageList):
                    image_name= '0{}_{}'.format(i+1,'_image.jpg') # This will show for example 01_image.jpg
                    urllib.request.urlretrieve(URL, image_name)
                    local_path_thumb = os.path.join(dir_base , image_name)
                    df[i]['local_image_path']=local_path # adding that locally fetched image path to pandas column
    

    2. In case you have image URLs in separate column in Pandas dataframe. First create function for getting local URL for single image

       get_image_local(URL):            
            image_name= '0{}_{}'.format(i+1,'_image.jpg')
            urllib.request.urlretrieve(URL, image_name)
            local_path_image = os.path.join(dir_base, image_name)
            return (local_path_image)
    

    Than use lambda expression to map that to new column imageLocal:

    df['imageLocal'] = df.URL.map(lambda f: get_image_local(f)) 
    

    df['imageLocal'] should look something like this:

    0 C:\Users\username\Documents\Base_folder\01_image.jpg         
    1 C:\Users\username\Documents\Base_folder\02_image.jpg                          
    2 C:\Users\username\Documents\Base_folder\03_image.jpg
    

    Next 3 PILL functions you can just copy paste:

    import glob
    import random
    import base64
    import pandas as pd
    
    from PIL import Image
    from io import BytesIO
    from IPython.display import HTML
    import io
    
    pd.set_option('display.max_colwidth', -1)
    
    
    def get_thumbnail(path):
        path = "\\\\?\\"+path # This "\\\\?\\" is used to prevent problems with long Windows paths
        i = Image.open(path)    
        return i
    
    def image_base64(im):
        if isinstance(im, str):
            im = get_thumbnail(im)
        with BytesIO() as buffer:
            im.save(buffer, 'jpeg')
            return base64.b64encode(buffer.getvalue()).decode()
    
    def image_formatter(im):
        return f''
    

    We can pass our local image path to get_thumbnail(path) with following:

    df['imagePILL'] = df.imageLocal.map(lambda f: get_thumbnail(f))
    

    And df['imagePILL'] should look like this:

    0    
    1    
    2    
    

    You can resort pandas dataframe to get your new column in desired position:

    df= df.reindex(sorted(df.columns), axis=1)
    

    And now if you want to view pandas dataframe with resized images just call image_formatter function in IPython.display HTML function:

    HTML(df.to_html(formatters={'imagePILL': image_formatter}, escape=False))
    

    You can use any other way of showing HTML, important thing is to get PIL object inside pandas dataframe.

提交回复
热议问题