【问题标题】:Evaluating multiple conditions in if-then-else block in a Pandas DataFrame在 Pandas DataFrame 中评估 if-then-else 块中的多个条件
【发布时间】:2016-11-27 03:39:09
【问题描述】:

我想通过在 if-then-else 块中评估多个条件来在 Pandas DataFrame 中创建一个新列。

if events.hour <= 6:
    events['time_slice'] = 'night'
elif events.hour <= 12:
    events['time_slice'] = 'morning'
elif events.hour <= 18:
    events['time_slice'] = 'afternoon'
elif events.hour <= 23:
    events['time_slice'] = 'evening'

当我运行它时,我收到以下错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

所以我尝试通过添加如下所示的任何语句来解决这个问题:

if (events.hour <= 6).any():
    events['time_slice'] = 'night'
elif (events.hour <= 12).any():
    events['time_slice'] = 'morning'
elif (events.hour <= 18).any():
    events['time_slice'] = 'afternoon'
elif (events.hour <= 23).any():
    events['time_slice'] = 'evening'

现在我没有收到任何错误,但是当我检查 time_slice 的唯一值时,它只显示 'night'

np.unique(events.time_slice)

array(['night'], dtype=object)

我该如何解决这个问题,因为我的数据包含应该是“早上”、“下午”或“晚上”的样本。谢谢!

【问题讨论】:

    标签: python pandas dataframe conditional


    【解决方案1】:

    您可以使用pd.cut() 方法对您的数据进行分类:

    演示:

    In [66]: events = pd.DataFrame(np.random.randint(0, 23, 10), columns=['hour'])
    
    In [67]: events
    Out[67]:
       hour
    0     5
    1    17
    2    12
    3     2
    4    20
    5    22
    6    20
    7    11
    8    14
    9     8
    
    In [71]: events['time_slice'] = pd.cut(events.hour, bins=[-1, 6, 12, 18, 23], labels=['night','morning','afternoon','evening'])
    
    In [72]: events
    Out[72]:
       hour time_slice
    0     5      night
    1    17  afternoon
    2    12    morning
    3     2      night
    4    20    evening
    5    22    evening
    6    20    evening
    7    11    morning
    8    14  afternoon
    9     8    morning
    

    【讨论】:

    • 也许第一个 bin 是 -1,因为如果条目是 0,它可能会变成 NaN?
    【解决方案2】:

    你可以创建一个函数:

    def time_slice(hour):
        if hour <= 6:
            return 'night'
        elif hour <= 12:
            return 'morning'
        elif hour <= 18:
            return 'afternoon'
        elif hour <= 23:
            return 'evening'
    

    那么events['time_slice'] = events.hour.apply(time_slice) 应该可以解决问题。

    【讨论】:

      【解决方案3】:

      这是一个 NumPy 方法 -

      tags = ['night','morning','afternoon','evening']
      events['time_slice'] = np.take(tags,((events.hour.values-1)//6).clip(min=0))
      

      示例运行 -

      In [130]: events
      Out[130]: 
         hour time_slice
      0     0      night
      1     8    morning
      2    16  afternoon
      3    20    evening
      4     2      night
      5    14  afternoon
      6     7    morning
      7    18  afternoon
      8     8    morning
      9    22    evening
      

      【讨论】:

      • ((events.hour.values-1)//6).clip(min=0) - 这很聪明
      • @MaxU 我猜是这样,但仅适用于定期间隔。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2021-12-10
      • 2020-06-01
      • 2015-02-15
      • 2018-01-13
      • 2017-06-04
      • 2023-01-11
      相关资源
      最近更新 更多