使用for循环和if语句逐行附加到DataFrame

时间:2019-10-29 22:19:09

标签: python pandas dataframe

我正在努力寻找一种遍历数据框的方式,并使用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中的所有列设置为最后一个迭代值。

逐行迭代并应用此逻辑的最佳方法是什么?我想念一些简单的东西吗?

3 个答案:

答案 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.mapdf.aggreagte,因为aggreagteapply的基础。