Как я могу добавить список сохраненных изображений в существующий фрейм данных в пандах? - PullRequest
0 голосов
/ 01 сентября 2018

Я надеялся, что кто-нибудь сможет мне помочь. Я пытаюсь сохранить список сохраненных изображений из 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 голосов
/ 01 сентября 2018

Если вы работаете в ноутбуке 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...