python - 根据用户输入绘制特定列

标签 python python-3.x pandas matplotlib

我有一个具有以下设置的数据框:

      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=x[header_list] 选择 y 轴.

编辑

这是我运行上述代码时收到的错误消息。

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

最佳答案

我在弄清楚您的示例代码时遇到了麻烦,可以帮助解决问题的一件事是重新创建一个更简单的版本,而不是难以处理的列名。

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

关于python - 根据用户输入绘制特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741851/

相关文章:

python - 在python 3.4中获取与数字成比例的范围内的值

python - 从破折号分隔的字符串创建多级字典(未知多深)

python - 根据不同类型的值派生日期列

python - 在Python中初始化列表的字典并更新其值

python - 导入错误 : cannot import name ellipkm1

python - 在 lambda 函数中使用条件

python - 在极坐标图中移动偏移文本位置

python - 提取值 (snow on ground cm) >0(大于 0)的月份中的最大天数

python - 替换问题 - Pandas 数据框

python - 如何等到 Excel 计算公式后再继续使用 win32com