【问题标题】:Appending to a DataFrame line by line, using a for loop and if statement使用 for 循环和 if 语句逐行附加到 DataFrame
【发布时间】:2019-10-29 22:19:09
【问题描述】:

我正在努力找出一种遍历数据框的方法,并使用 if 语句来确定一天是工作日还是周末(并复制,使用 holiday 包查找假期)

测试数据

|    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 有一个日期列和 3 列数据。实际数据集有大约 5 年的数据。我想添加一些条件来检查该日期是周末还是工作日,并将其添加为新列。我没有问题迭代和检查日期,但我找不到任何允许我逐行附加或写入数据帧的东西。

到目前为止,我有这样的事情:

for i in df.date:
    if i.weekday() < 5:
        df['period2'] = ('wkdy')
    else:
        df['period2'] = ('wknd')

显然这不能满足我的需求,因为它只是将 DF 中的所有列设置为最后一个迭代值。

逐行迭代和应用此逻辑的最佳方法是什么?我错过了一些简单的东西吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用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]):
        ....
    

    【讨论】:

    • 在使用python for i in range(len(df.date)): df['week'][i] = (df['date'][i]).weekday() 添加一列当日计数后,效果非常好,谢谢!
    【解决方案2】:

    我会尝试使用loc 函数并将这些函数一次应用于整个列,以便将操作向量化并更快地执行:

    df['week'] = df['date'].weekday()
    df['week'].loc[df['week'] < 5] = 'wkday'
    df['week'].loc[df['week'] >= 5] = 'wknd'
    

    【讨论】:

    • 在 99% 的情况下,二元选择应该在心理上大喊np.where()(我将这 1% 的情况留给我想不到但可能存在的情况)。这种方法需要对数据运行 2 次。
    • @roganjosh 我同意,我暂时忘记了那个。
    【解决方案3】:

    您可以使用apply。它返回 seriesDataFrame

    df['week'] = df['date'].apply(lambda x: "wkdy" if x.weekday() < 5 else "wked")
    

    还有一些其他功能可以做到这一点,比如df.mapdf.aggreagte,因为aggreagte if basic of apply

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多