我正在努力寻找一种遍历数据框的方式,并使用if语句来确定一天是工作日还是周末(并进行复制,并使用Holidays包查找假期)
| Date |col1 |col2 |col3 |----| week | <- Add
|------------|-----|-----|-----|----|------|
| 2019-10-27 | 1.5 | 2.4 | 1.9 |----| wknd |
| 2019-10-28 | 2.7 | 2.1 | 1.9 |----| wkdy |
| 2019-10-29 | 1.4 | 2.7 | 1.8 |----| wkdy |
我的示例df有一个date列和3列数据。实际的数据集大约有5年的数据。我想添加一些条件检查该日期是周末还是工作日,并将其添加为新列。我没有任何迭代和检查日期的问题,但是找不到任何可以逐行追加或写入数据框的内容。
到目前为止,我有这样的事情:
for i in df.date:
if i.weekday() < 5:
df['period2'] = ('wkdy')
else:
df['period2'] = ('wknd')
很显然,这不能满足我的需求,因为它只是将DF中的所有列设置为最后一个迭代值。
逐行迭代并应用此逻辑的最佳方法是什么?我想念一些简单的东西吗?
答案 0 :(得分:2)
您可以使用np.where
import numpy as np
df['period2'] = np.where(df['date'].dt.weekday < 5,'wkdy','wknd')
如果您真的想使用for循环,则应通过
遍历行for i in range(df.shape[0]):
....
答案 1 :(得分:0)
我会尝试使用loc
函数并将这些函数立即应用于整个列,以便对操作进行矢量化处理并更快地执行:
df['week'] = df['date'].weekday()
df['week'].loc[df['week'] < 5] = 'wkday'
df['week'].loc[df['week'] >= 5] = 'wknd'
答案 2 :(得分:0)
您可以使用apply
。它返回一个series
或一个DataFrame
,
df['week'] = df['date'].apply(lambda x: "wkdy" if x.weekday() < 5 else "wked")
还有其他一些功能可以执行,例如df.map
,df.aggreagte
,因为aggreagte
是apply
的基础。