Python dataframe,ValueError:形状不匹配:无法将对象广播到单个形状

Python dataframe,ValueError:形状不匹配:无法将对象广播到单个形状,python,pandas,csv,datetime,matplotlib,Python,Pandas,Csv,Datetime,Matplotlib,我有这段代码,用于跟踪特定交付的延迟时间以及截止日期的延迟时间。我将它们分类为:提前交货、准时交货和延迟交货。如果我包括每个材料编号,我就能够绘制这些结果。然而,当我指定了材料编号时,我遇到了一个错误(如下所列),我还提供了终端中准确打印的内容。似乎dataframe已经创建了两行标记为不同的东西,并从中获得了计数,因此我无法绘制图形,因为有两个值,因此我如何修复代码以简单地提取“计数编号”,并使用该编号绘制条形图 import matplotlib.pyplot as plt; plt.rcd

我有这段代码,用于跟踪特定交付的延迟时间以及截止日期的延迟时间。我将它们分类为:提前交货、准时交货和延迟交货。如果我包括每个材料编号,我就能够绘制这些结果。然而,当我指定了材料编号时,我遇到了一个错误(如下所列),我还提供了终端中准确打印的内容。似乎dataframe已经创建了两行标记为不同的东西,并从中获得了计数,因此我无法绘制图形,因为有两个值,因此我如何修复代码以简单地提取“计数编号”,并使用该编号绘制条形图

import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


Material= 'Material'
DELIVERY_DATE = 'Delivery Date'
DESIRED_DATE = 'source desired delivery date'
DELAYED_DAYS = 'Delayed Days'



StartYear = input("Start Year? ")
StartYear = int(StartYear)
EndYear = input("End Year? ")
EndYear = int(EndYear) 




DELIVERY_DATE = 'Delivery Date'
DESIRED_DATE = 'source desired delivery date'
DELAYED_DAYS = 'Delayed Days'


df = pd.read_csv('otdo.csv')

df['Delivery Date'] = pd.to_datetime(df['Delivery Date'], format='%m/%d/%Y')
df['source desired delivery date'] = pd.to_datetime(df['source desired delivery date'], format='%m/%d/%Y')


late_threshold = pd.Timedelta(days=0)
late_threshold2 = pd.Timedelta(days=10)

df[DELIVERY_DATE] = pd.to_datetime(df[DELIVERY_DATE])
df[DESIRED_DATE] = pd.to_datetime(df[DESIRED_DATE])
df[DELAYED_DAYS] = df[DELIVERY_DATE] - df[DESIRED_DATE]


df2 = df[(df['Delivery Date'].dt.year >= int(StartYear)) & (df['Delivery Date'].dt.year <= int(EndYear))]



df3 = df2[ df2[DELAYED_DAYS] > late_threshold] 
df3 =  df3[late_threshold2 > df3[DELAYED_DAYS]]
df3 = df3.loc[df['Material'].str.contains('20080810', na=False)]




df4 = df2[ df2[DELAYED_DAYS] > late_threshold2] 
df4 = df4.loc[df['Material'].str.contains('20080810', na=False)]


df5 = df2[df2[DELAYED_DAYS] <= late_threshold] 
df5 = df5.loc[df['Material'].str.contains('20080810', na=False)]


df6 = df2.loc[df['Material'].str.contains('20080810', na=False)]




df7 = df2[ df2[DELAYED_DAYS] > late_threshold] 
df7 =  df7[late_threshold2 > df7[DELAYED_DAYS]]



df8 = df2[ df2[DELAYED_DAYS] > late_threshold2] 


df9 = df2[df2[DELAYED_DAYS] <= late_threshold] 


zero = df2.count() 
zero2 = df3.count()
zero3 = df4.count() 
zero4 = df5.count() 
zero5 = df7.count()
zero7 = df9.count() 

hey = zero7.iloc[1:1]
print(hey)
print(zero7)

objects = ('1', '2', '3')
y_pos = np.arange(len(objects))
values = [zero5, zero4, zero7]

plt.bar(y_pos, values, align='center', alpha=0.2)
plt.xticks(y_pos, objects)

plt.show()

错误消息显示,在

plt.bar(y_pos, values...
matplotlib需要一个1D数组作为条形高度,但使用
可以提供一个数据帧列表,不能广播到简单的1D数组

您应该使用标量列表来实现这一点

例如

如果我理解您的数据模型是正确的。
请注意,如果要绘制两个阵列,即出于比较原因在每个y_位置绘制两个条形图,可通过调用
plt.bar(…)
两次来完成。首先使用一个数组,其次使用另一个数组,向y-pos数组添加一些y偏移。有关示例,请参见

但是-我建议您不要创建太多从csv导入派生的进一步数据帧,而是创建一个单独的数据帧,其中包含布尔结果,具体取决于您的阈值时间,可能已经转换为“int”以计算总和,例如:

df2['thresh1'] = (df2[DELAYED_DAYS] > late_threshold).astype(int)
df2['thresh2'] = (df2[DELAYED_DAYS] > late_threshold).astype(int)
这使您有机会在一行中进行计算

zeros = df2.sum()
你所说的

那么第一次测试可能是

zeros.plot(kind='bar')

工作得很好!非常感谢,不客气。然而,我认为从csv到绘图的路径是可以优化的。我当然不确定我是否理解了您的数据,您的任务是否完全正确,但我会在进一步的编辑中尝试给您一些额外的提示。
df2['thresh1'] = (df2[DELAYED_DAYS] > late_threshold).astype(int)
df2['thresh2'] = (df2[DELAYED_DAYS] > late_threshold).astype(int)
zeros = df2.sum()
zeros.plot(kind='bar')