【问题标题】:Output of for combined loop and nested if is not coming out as intended for pandasfor 组合循环和嵌套 if 的输出未按 Pandas 的预期输出
【发布时间】:2021-10-06 11:09:28
【问题描述】:

从 Pandas 数据框 holiday_sales_4,我正在尝试使用 if/for 循环打印日期及其相应假日类型的输出(例如:25-Dec-2021Christmas)。

Weekly_Sales 的值为True 时,应该打印输出。

数据框holiday_sales_4如下:

    Date        Weekly_Sales
0   2010-02-12  True
1   2010-09-10  False
2   2010-11-26  True
3   2010-12-31  False
4   2011-02-11  True
5   2011-09-09  False
6   2011-11-25  True
7   2011-12-30  False
8   2012-02-10  True
9   2012-09-07  True

我正在尝试使用此代码:

for i in range(0, len(holiday_sales_4)):
    comparison=holiday_sales_4.iloc[i]['Weekly_Sales']
    if comparison == True:
        date_of_true=holiday_sales_4.iloc[i]['Date'].strftime('%d-%b-%y')
        if (date_of_true==datetime.datetime(2010, 2, 12) or 
            date_of_true==datetime.datetime(2011, 2, 11) or 
            date_of_true==datetime.datetime(2012, 2, 10) or 
            date_of_true==datetime.datetime(2013, 2, 18)):
            return_holiday="Superbowl"
        elif (date_of_true==datetime.datetime(2010, 9, 10) or 
              date_of_true==datetime.datetime(2011, 9, 11) or 
              date_of_true==datetime.datetime(2012, 9, 12) or 
              date_of_true==datetime.datetime(2013, 9, 13)):
            return_holiday="Labour Day"
        elif (date_of_true==datetime.datetime(2010, 11, 26) or 
              date_of_true==datetime.datetime(2011, 11, 25) or 
              date_of_true==datetime.datetime(2012, 11, 23) or 
              date_of_true==datetime.datetime(2013, 11, 29)):
            return_holiday="Thanksgiving"
        elif (date_of_true==datetime.datetime(2010, 12, 31) or 
              date_of_true==datetime.datetime(2011, 12, 30) or 
              date_of_true==datetime.datetime(2012, 12, 28) or 
              date_of_true==datetime.datetime(2013, 12, 27)):
            return_holiday="Christmas"
            
        print(date_of_true,'-', return_holiday)

输出似乎为date_of_true 正确地迭代了循环/if 条件,但不适用于return_holiday

12-Feb-10 - 07-Sep-12
26-Nov-10 - 07-Sep-12
11-Feb-11 - 07-Sep-12
25-Nov-11 - 07-Sep-12
10-Feb-12 - 07-Sep-12
07-Sep-12 - 07-Sep-12

预期的输出是这样的:

12-Feb-10 - Superbowl
26-Nov-10 - Thanksgiving
11-Feb-11 - Superbowl
25-Nov-11 - Thanksgiving
10-Feb-12 - Superbowl
07-Sep-12 - Labour Day

我是编码新手,所以我确定解决方案很简单,但我找不到!

【问题讨论】:

  • 您的预期输出?
  • 我已经编辑了我的问题以增加清晰度。谢谢!

标签: python pandas dataframe for-loop if-statement


【解决方案1】:

既然你只想打印,那么你可以使用:

df['Date']=pd.to_datetime(df['Date'])

for x,y in zip(df['Date'].dt.strftime('%d-%b-%y'),df['Weekly_Sales']):
    if x in ['12-Feb-10', '11-Feb-11', '10-Feb-12', '18-Feb-13'] and y:
        print(x,'-','Superbowl')
    elif x in ['10-Sep-10', '11-Sep-11', '12-Sep-12', '13-Sep-13', '07-Sep-12'] and y:
        print(x,'-','Labour Day')
    elif x in ['26-Nov-10', '25-Nov-11', '23-Nov-12', '29-Nov-13'] and y:
        print(x,'-','Thanksgiving')
    elif x in ['31-Dec-10', '30-Dec-11', '28-Dec-12', '27-Dec-13'] and y:
        print(x,'-','Christmas')

以上代码的输出:

12-Feb-10 - Superbowl
26-Nov-10 - Thanksgiving
11-Feb-11 - Superbowl
25-Nov-11 - Thanksgiving
10-Feb-12 - Superbowl
07-Sep-12 - Labour Day

您可以通过以下方式修复当前代码:

for i in range(0, len(holiday_sales_4)):
    comparison=holiday_sales_4.iloc[i]['Weekly_Sales']
    if comparison == True:
        date_of_true=holiday_sales_4.iloc[i]['Date']
        if (date_of_true==datetime.datetime(2010, 2, 12) or 
            date_of_true==datetime.datetime(2011, 2, 11) or 
            date_of_true==datetime.datetime(2012, 2, 10) or 
            date_of_true==datetime.datetime(2013, 2, 18)):
            return_holiday="Superbowl"
            print(date_of_true.strftime('%d-%b-%y'),'-', return_holiday)
        elif (date_of_true==datetime.datetime(2010, 9, 10) or 
              date_of_true==datetime.datetime(2011, 9, 11) or 
              date_of_true==datetime.datetime(2012, 9, 12) or 
              date_of_true==datetime.datetime(2013, 9, 13)):
            return_holiday="Labour Day"
            print(date_of_true.strftime('%d-%b-%y'),'-', return_holiday)
        elif (date_of_true==datetime.datetime(2010, 11, 26) or 
              date_of_true==datetime.datetime(2011, 11, 25) or 
              date_of_true==datetime.datetime(2012, 11, 23) or 
              date_of_true==datetime.datetime(2013, 11, 29)):
            return_holiday="Thanksgiving"
            print(date_of_true.strftime('%d-%b-%y'),'-', return_holiday)
        elif (date_of_true==datetime.datetime(2010, 12, 31) or 
              date_of_true==datetime.datetime(2011, 12, 30) or 
              date_of_true==datetime.datetime(2012, 12, 28) or 
              date_of_true==datetime.datetime(2013, 12, 27)):
            return_holiday="Christmas"
            print(date_of_true.strftime('%d-%b-%y'),'-', return_holiday)

注意:问题出在你的方法是strftime()这一行:

date_of_true=holiday_sales_4.iloc[i]['Date'].strftime('%d-%b-%y')
  • strftime 更改了 'date_of_true' 的格式,因此您的 date_of_true 变得像 '25-Nov-11' 和字符串 dtype,因此您无法将其与 datetime.datetime(2011, 11, 25) 进行比较

  • 另一个问题是你在循环结束时打印它print(date_of_true,'-', return_holiday),所以每次迭代时 return_holiday 的值都会改变

【讨论】:

  • 是的,将假期类型添加到数据框本身是个好主意,但我希望有一个不允许这样做的解决方案。知道我的 if/for 操作是怎么错的吗?
  • @Brian 如果您不想将它们存储在数据框中,可以将它们存储在变量中,或者您可以通过删除“Holiday_type”列来制作另一个数据框
  • @Brian 更新了答案。请看一下:)
  • @Anurag Dabas 这看起来很整洁。它怎么知道只在 Weekly_Sales 为 True 时才打印?
  • @Brian Sir 更新了答案...添加了您的方法无法正常工作的原因...请查看并快乐编码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多