如何将已保存图像的列表添加到现有的熊猫数据框中?

时间:2018-09-01 09:09:52

标签: python image pandas matplotlib

我希望有人能够帮助我。我正在尝试将MatPlotLib中已保​​存图像的列表存储为数据框(或列表),然后将其添加到现有数据框(有效地为数据框中的每个条目创建小条形图,例如数据栏)。

我成功地通过循环成功保存了图像。有242张图像。如何在数据框的列中显示这些图像。我希望很容易将其附加到我现有的数据框中,以直观地显示此数据集中的零值数量。我的代码给出了它的NoneType对象不可迭代的错误。

这是我的代码。 (这里的上半部分是为了澄清q1和q2是什么。)

谢谢。

import csv
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import sys

q1 = pandas.read_csv("data\q1.csv") #dataframe
q1.apply(lambda x: x.str.strip() if x.dtype == "object" else x) #strip whitespace
q1 = q1.dropna()
code = q1.loc[:,"Code"]
region = q1.loc[:,"Region"]
name = q1.loc[:,"Name"]
heads = list(q1.columns.values) #creates list of header values

nz = (q1 == 0).sum(axis=1) #count number of zero values in rows
q2 = q1[['Code','Region','Name']]
q2 = q2.assign(nz=nz.values)

samples=[]
y=1
for val in q2['nz']:
    val = val/q2['nz'].max() * 100

    plt.barh(val, width = val, color="blue")
    plt.xlim((0,100))
    plt.yticks([0])
    plt.axis('off')

    x = plt.savefig("value" + str(y) + ".png", bbox_inches='tight')
    samples.append(x)
    plt.close()


    y = y + 1

imgdf = pandas.DataFrame.from_records(samples)
q3 = q2.append(imgdf)

1 个答案:

答案 0 :(得分:0)

如果您在Jupyter笔记本中工作,则可以使用HTML显示屏显示图像。

# Some imports
import base64
import pandas as pd

from PIL import Image
from io import BytesIO
from IPython.display import HTML

pd.set_option('display.max_colwidth', -1)

def get_thumbnail(path):
    """
    Output a 150x150 sized PIL Image
    """
    i = Image.open(path)
    i.thumbnail((150, 150), Image.LANCZOS)
    return i

def image_base64(im):
    """
    Convert to base64 to be given as the src field of img in HTML
    """
    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'<img src="data:image/jpeg;base64,{image_base64(im)}">'

# Skipping some of your code
image_paths = []
for val in q2['nz']:
    #... Do somethings here
    x = plt.savefig("value" + str(y) + ".png", bbox_inches='tight')
    plt.close()

    image_paths.append("value" + str(y) + ".png")

    y = y + 1

q2["images_paths"] = pd.Series(image_paths).values
q2["image"] = q2.image_paths.map(lambda f: get_thumbnail(f))

# Display PIL Images embedded in the dataframe
HTML(q2.to_html(formatters={"image": image_formatter}, escape=False))