【问题标题】:Plotting a graph from dataframe with multiple csv files从具有多个 csv 文件的数据框中绘制图形
【发布时间】:2021-09-16 19:59:14
【问题描述】:

我有 2 个 csv 文件

file1.csv

,DATE,DAY,OPEN,2PM,CLOSE,STATUS
0,2021-05-18,Tuesday,538.8,530.45,530.8,0
1,2021-05-19,Wednesday,530.65,532.6,536.85,0
2,2021-05-20,Thursday,536.95,537.05,536.35,1
3,2021-05-21,Friday,538.0,538.2,537.55,1
4,2021-05-24,Monday,537.3,535.05,532.85,1
5,2021-05-25,Tuesday,535.9,531.35,529.65,1
6,2021-05-26,Wednesday,532.95,530.55,532.1,0
7,2021-05-27,Thursday,532.95,529.65,529.85,0

file2.csv

,DATE,DAY,OPEN,2PM,CLOSE,STATUS
0,2021-05-18,Tuesday,538.8,530.45,530.8,1
1,2021-05-19,Wednesday,530.65,532.6,536.85,0
2,2021-05-20,Thursday,536.95,537.05,536.35,1
3,2021-05-21,Friday,538.0,538.2,537.55,1
4,2021-05-24,Monday,537.3,535.05,532.85,2
5,2021-05-25,Tuesday,535.9,531.35,529.65,1
6,2021-05-26,Wednesday,532.95,530.55,532.1,0
7,2021-05-27,Thursday,532.95,529.65,529.85,0

file3.csv

,DATE,DAY,OPEN,2PM,CLOSE,STATUS
0,2021-05-18,Tuesday,538.8,530.45,530.9,0
1,2021-05-19,Wednesday,530.65,532.6,536.85,1
2,2021-05-20,Thursday,536.95,537.05,536.35,0
3,2021-05-21,Friday,538.0,538.2,537.55,1
4,2021-05-24,Monday,537.3,535.05,532.85,1
5,2021-05-25,Tuesday,535.9,531.35,529.65,0
6,2021-05-26,Wednesday,532.95,530.55,532.1,0
7,2021-05-27,Thursday,532.95,529.65,529.85,1

可以使用绘制单个 csv 文件的图表

import pandas as pd
df = pd.read_csv("file1.csv")
df.groupby('DAY')['STATUS'].value_counts(normalize=True).unstack().plot.bar()

将情节显示为

这个情节有 5 个 twinBARS(周一、周二、周三等)用于一个文件。

但是,我想在一个图中从所有 3 个文件中绘制“星期一”的数据。谁能告诉我如何处理多个文件?

这意味着,情节将有 3 个双条。每个 TWIN BAR 将代表每个文件中的星期一 例如

Monday from file1.csv
Monday from file2.csv
Monday from file3.csv

我想为所有 3 个文件绘制周一的图表。

【问题讨论】:

  • 哪个问题被否决了有什么理由吗?还是仅仅因为不想回答或不知道答案而被否决?
  • 我不确定我是否理解你的问题,但也许你可以将这三个文件与pd.concat([df1, df2, df3]) 结合起来,最后你会使用你提供的代码?
  • Concat 将无法工作,因为我需要星期一将每个文件作为条形而不是合并
  • 那么你应该在你的问题中添加更多细节,因为不清楚你想要什么(至少对我来说)
  • @RiccardoBucco 已添加,请兄弟检查。

标签: python python-3.x pandas matplotlib


【解决方案1】:

在连接它们之前为每个 df 创建一个 FILE 列。然后按所需日期过滤(本例中为Tuesday)并按DAYFILE 分组:

df1 = pd.read_csv('file1.csv').assign(FILE=1)
df2 = pd.read_csv('file2.csv').assign(FILE=2)
df3 = pd.read_csv('file3.csv').assign(FILE=3)
df = pd.concat([df1, df2, df3]).reset_index(drop=True)

# or concat via generator
# df = pd.concat(pd.read_csv(f'file{i}.csv').assign(FILE=i) for i in (1,2,3).reset_index(drop=True))

(df[df.DAY.eq('Tuesday')]
    .groupby(['DAY', 'FILE'])['STATUS']
    .value_counts(normalize=True)
    .unstack().plot.bar())
plt.xticks(rotation=0)


要按给定的threshold 过滤,请将值计数保存到中间的counts df 并使用它来过滤:

day, threshold = 'Tuesday', 0.8
counts = df[df.DAY.eq(day)].groupby(['DAY', 'FILE'])['STATUS'].value_counts(normalize=True).unstack()
counts[counts > threshold].plot.bar()

【讨论】:

  • 好兄弟。一个问题,我们怎样才能只绘制那些价值超过 0.8 的 Tue? (对于 0 或对于 1)
  • 啊哈好吧...非常感谢兄弟!
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2020-06-21
  • 2020-05-13
  • 2021-10-10
  • 2021-01-18
相关资源
最近更新 更多