【问题标题】:Get part of day (morning, afternoon, evening, night) in Python dataframe在 Python 数据框中获取部分时间(早上、下午、晚上、晚上)
【发布时间】:2019-08-29 11:28:14
【问题描述】:

这是我的数据框,我需要根据行值的时间小时(早上、下午、晚上、晚上)创建一个新列

这是我的代码

if ((prods['hour'] < 4) & (prods['hour'] > 8 )):
    prods['session'] = 'Early Morning'
elif ((prods['hour'] < 8) & (prods['hour'] > 12 )):
    prods['session'] = 'Morning'
elif ((prods['hour'] < 12) & (prods['hour'] > 16 )):
    prods['session'] = 'Noon'
elif ((prods['hour'] < 16) & (prods['hour'] > 20 )):
    prods['session'] = 'Eve'
elif ((prods['hour'] < 20) & (prods['hour'] > 24 )):
    prods['session'] = 'Night'
elif ((prods['hour'] < 24) & (prods['hour'] > 4 )):
    prods['session'] = 'Late Night'

这是我得到的错误

ValueError Traceback(最近调用 最后)在 ----> 1 if (prods['hour'] > 4 and prods['hour'] 8 和 prods['hour'] 12 and prods['hour']

/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py nonzero(self) 1476 raise ValueError("{0} 的真值不明确。" 1477 "使用 a.empty, a.bool()、a.item()、a.any() 或 a.all()。” -> 1478 .format(self.class.name)) 1479 1480 bool = 非零

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

请帮忙

【问题讨论】:

  • 试过了同样的错误。
  • 您正在将单个值与整个列进行比较,这就是您收到该错误的原因。以文本而不是图像的形式提供数据

标签: python pandas analytics


【解决方案1】:

使用cut 或带有and 的自定义函数,并将&lt; 更改为&gt;,将&gt; 更改为&lt;=,并为每个值添加return

prods = pd.DataFrame({'hour':range(1, 25)})

b = [0,4,8,12,16,20,24]
l = ['Late Night', 'Early Morning','Morning','Noon','Eve','Night']
prods['session'] = pd.cut(prods['hour'], bins=b, labels=l, include_lowest=True)

def f(x):
    if (x > 4) and (x <= 8):
        return 'Early Morning'
    elif (x > 8) and (x <= 12 ):
        return 'Morning'
    elif (x > 12) and (x <= 16):
        return'Noon'
    elif (x > 16) and (x <= 20) :
        return 'Eve'
    elif (x > 20) and (x <= 24):
        return'Night'
    elif (x <= 4):
        return'Late Night'

prods['session1'] = prods['hour'].apply(f)
print (prods)
    hour        session       session1
0      1     Late Night     Late Night
1      2     Late Night     Late Night
2      3     Late Night     Late Night
3      4     Late Night     Late Night
4      5  Early Morning  Early Morning
5      6  Early Morning  Early Morning
6      7  Early Morning  Early Morning
7      8  Early Morning  Early Morning
8      9        Morning        Morning
9     10        Morning        Morning
10    11        Morning        Morning
11    12        Morning        Morning
12    13           Noon           Noon
13    14           Noon           Noon
14    15           Noon           Noon
15    16           Noon           Noon
16    17            Eve            Eve
17    18            Eve            Eve
18    19            Eve            Eve
19    20            Eve            Eve
20    21          Night          Night
21    22          Night          Night
22    23          Night          Night
23    24          Night          Night

【讨论】:

  • 感谢@jezrael 工作正常。请提供一些学习材料来提高自己
  • @Vijayaraghavan - here 是很好的教程,我喜欢现代熊猫。
【解决方案2】:

经过一番研究,这是我能找到的最简单、最有效的实现。

prods['period'] = (prods['hour_int'].dt.hour % 24 + 4) // 4
prods['period'].replace({1: 'Late Night',
                      2: 'Early Morning',
                      3: 'Morning',
                      4: 'Noon',
                      5: 'Evening',
                      6: 'Night'}, inplace=True)

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多