указание c столбцов на основе пользовательского ввода - PullRequest
3 голосов
/ 15 января 2020

У меня есть фрейм данных со следующей настройкой:

      a     c     g     s
Ind   b     d     t     d 
0    11    12     22    33
1    13    14     44    101

Цель - получить входные данные от пользователя через GUI, сохранить входные данные в виде списка и сравнить его со списком заголовков в кадр данных. Если они совпадают, то построите столбец там, где они совпадают (столбец будет осью Y, а индекс будет осью X).

Например, если пользователь выберет [('c','d')], я бы как код для построения этого столбца. Вот что у меня есть.

df = pd.read_csv('foo.csv',sep=r'\s*,\s*', encoding='ascii', engine='python')
header_list = [('a','b'),('c','d'),('g','t'),('s','d')]
user_Input_list = [('c','d')]
sub_list = []

for contents in header_list:
    for contents2 in user_Input_list:
        if contents == contents2:
            ax = df.reset_index().plot(x='Ind', y=x[header_list], kind='bar')
            for p in ax.patches:
                ax.annotate('{:.2E}'.format(Decimal(str(p.get_height()))),
                            (p.get_x(),p.get_height()))
            plt.tight_layout()
            plt.show()

Я думаю, что проблема заключается в том, как я пытаюсь выбрать ось Y с помощью y=x[header_list].

Редактировать

Вот сообщение об ошибке, которое я получаю при запуске вышеуказанного кода.

Traceback (most recent call last):
  File "/home/JM9/PycharmProjects/subfolder/subfolder.py", line 360, in <module>
    ax = x.reset_index().plot(x='Ind', y=x[header_list], kind='bar')
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/plotting/_core.py", line 780, in __call__
    data = data[y].copy()
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/core/frame.py", line 2982, in __getitem__
    return self._getitem_frame(key)
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/core/frame.py", line 3081, in _getitem_frame
    raise ValueError("Must pass DataFrame with boolean values only")
ValueError: Must pass DataFrame with boolean values only

1 Ответ

2 голосов
/ 15 января 2020

У меня возникают проблемы с выяснением вашего примера кода, одна вещь, которая может помочь решить эту проблему, состоит в том, чтобы заново создать более простую версию того, что вы пытаетесь сделать, без сложных имен столбцов .

import random
import pandas as pd

data={
    'a': [random.randint(0, 50) for i in range(4)],
    'b': [random.randint(0, 50) for i in range(4)],
    'c': [random.randint(0, 50) for i in range(4)]
}

df = pd.DataFrame(data)
df.index = df.index.rename('Ind')

user_input = 'b'

if user_input in df.columns:
    ax = df[user_input].plot(x='Ind', kind='bar')

Некоторые полезные выводы для вас: (a) вместо циклов вы можете выполнить простой тест, чтобы проверить, равен ли ввод пользователя столбцу фрейма данных (if user_input in df:) и (b) Вы можете позвонить .plot() против отдельных столбцов.

Редактировать: изменено 'b' на user_input

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...