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