【问题标题】:Filter columns in a csv file and output plot过滤 csv 文件中的列并输出绘图
【发布时间】:2020-01-18 19:34:56
【问题描述】:

我正在尝试过滤 CSV 中的列,就像您在 excel 中一样。然后基于该过滤器,我希望它调用不同的列并将该列中的数据输出到绘图中。

我已尝试自行打印代码并正确打印。我只是不确定语法。当我打印代码时,它表明我可以正确搜索一列

data.head()
print('banana',
      data[('Sub-Dept')] == 'Stow Each') #and data[('Sub-Dept')] == 'Stow Each Nike', 'Each Stow to Prime', 'Each Stow to Prime E', 'Each Stow to Prime W', 'Stow to Prime LeadPA')

但我不知道如何让它先过滤,然后在下面绘制。我对此很陌生。

我有一列里面有许多不同的可过滤名称。我想叫上面的那些名字。

import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 

x = []
y = []

data = pd.read_csv(r'C:\Users\rmond\Downloads\PS_csvFile.csv', encoding="ISO-8859-1", skiprows=6)


new_data = data.loc[(data['Sub-Dept'] == 'Stow Each')]
sns.set(style="whitegrid") #this is strictly cosmetic, you can change it any time
ax = sns.countplot(x='U.S. OSHA Recordable?', data=new_data)
plt.bar(x, y, label='Loaded from file!')
plt.ylabel('Quantity of Injuries')
plt.title('Injuries (past 4 weeks)')
plt.show() 

现在,我预计它会输出 1 个包含 2 个条形的图表。问题:它在一根柱上显示数量为 80,在另一根柱上显示 20。解决方案:从另一列过滤数据后,应在同一图表内的 1 条中显示 21,在另一条中显示 7。

绘图部分效果很好,从 Excel 中提取数据也是如此。我不知道该怎么做的唯一部分是过滤该列,然后基于该过滤器绘制图形。我不确定代码应该是什么样子以及应该去哪里。请帮忙

此处为 CSV 文件:https://drive.google.com/open?id=1yJ6iQL-bOvGSLAKPcPXqgk9aKLqUEmPK

【问题讨论】:

  • 请展示您的数据框以及过滤后的数据框的示例
  • 您能否展示您的数据框示例或与我们共享 .csv 文件?
  • 您只需要使用.loc 进行过滤尝试new_data = data.loc[data['Sub-Dept'] == 'Stow Each'] 然后使用seaborn 将其绘制出来。
  • 感谢您的快速响应,我已将文件保存到我的驱动器中。我不知道如何与你们分享。我将开始像 Datanovice 提到的那样处理 .loc。我不确定在哪里放置该代码。那是我的问题。但我会试着弄清楚
  • 是的!它工作,感谢Datanovice。正如您提到的,我可以按 1 项过滤列。但我需要一次过滤该列 6 个项目。那我该怎么做呢?

标签: python pandas csv matplotlib seaborn


【解决方案1】:

我很高兴知道这一点。我很难在互联网上找到这个问题的答案。所以我希望这对将来的其他人有所帮助。感谢 Datanovice 对 .loc 的初步构想。这帮助我进行了下一步。我的其余答案来自这里:https://www.geeksforgeeks.org/python-pandas-extracting-rows-using-loc/

对不起,我把我的 cmets 留在了代码中

import pandas as pd # powerful data visualization library
import numpy as np
import matplotlib.pyplot as plt # allows us to plot things
import csv # allows us to import and use CSV commands which are simple but effective
import seaborn as sns #https://seaborn.pydata.org/generated/seaborn.boxplot.html
# This website saved my life https://www.pythonforengineers.com/introduction-to-pandas/
# use this to check the available styles: plt.style.available

x = []
y = []

data = pd.read_csv(r'C:\Users\rmond\Downloads\PS_csvFile.csv', encoding="ISO-8859-1", skiprows=6, index_col="Sub-Dept") #skiprows allows you to skip the comments on top... & ecoding allows pandas to work on this CSV
new_data = data.loc[["Each Stow to Prime", "Each Stow to Prime E", "Each Stow to Prime W", "Stow Each", "Stow Each Nike", "Stow to Prime LeadPA",]]
sns.set(style="whitegrid") #this is strictly cosmetic, you can change it any time
ax = sns.countplot(x='U.S. OSHA Recordable?', data=new_data) #magic, so seaborn is designed to pull the dats from a URL. But when using pandas and seaborn there is a work around
# the key is that "countplot" literally does the work for you. its awesome
plt.bar(x, y, label='Loaded from file!')
plt.ylabel('Quantity of Injuries')
plt.title('Stow Injuries (past 4 weeks)')
plt.show() # shows the plot to the user

【讨论】:

    【解决方案2】:

    试试 pandas.query()

    熊猫query 可能有用。

    data = pd.read_csv(r'C:\Users\rmond\Downloads\PS_csvFile.csv', encoding="ISO-8859-1", skiprows=6)
    
    new_data = data.query("Sub-Dept == Stow Each or
                           Sub-Dept == RF_Pick")
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      相关资源
      最近更新 更多