【问题标题】:How to loop through pandas dataframe, and conditionally assign values to a row of a variable?如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?
【发布时间】:2019-06-22 23:04:18
【问题描述】:

我正在尝试遍历“vol”数据框,并有条件地检查 sample_date 是否在特定日期之间。如果是,则为另一列赋值。

这是我拥有的以下代码:

vol = pd.DataFrame(data=pd.date_range(start='11/3/2015', end='1/29/2019'))
vol.columns = ['sample_date']
vol['hydraulic_vol'] = np.nan
for i in vol.iterrows():
    if  pd.Timestamp('2015-11-03') <= vol.loc[i,'sample_date'] <= pd.Timestamp('2018-06-07'):
        vol.loc[i,'hydraulic_vol'] = 319779

这是我收到的错误: TypeError: 'Series' 对象是可变的,因此它们不能被散列

【问题讨论】:

    标签: python pandas loops if-statement conditional


    【解决方案1】:

    这是你正确的做法:

    cond = (pd.Timestamp('2015-11-03') <= vol.sample_date) & 
           (vol.sample_date <= pd.Timestamp('2018-06-07'))
    
    vol.loc[cond, 'hydraulic_vol'] = 319779
    

    【讨论】:

    • 试试vol.sample_date.between('2015-11-03', '2018-06-07')。 Datetimes 足够聪明,可以与字符串进行比较,并且 .between 更具可读性:D (IMO)。
    【解决方案2】:

    另一种方法是结合使用numpy 模块中的np.where 方法和.between 方法。

    这个方法的工作原理是这样的:
    np.where(condition, value if true, value if false)

    代码示例

    cond = vol.sample_date.between('2015-11-03', '2018-06-07')
    vol['hydraulic_vol'] = np.where(cond, 319779, np.nan)
    

    或者您可以将它们组合在一行代码中:

    vol['hydraulic_vol'] = np.where(vol.sample_date.between('2015-11-03', '2018-06-07'), 319779, np.nan)
    

    编辑
    我看到你是新来的,所以这是我在来到 python/pandas 时必须学习的东西。

    在数据帧上循环应该是你最后的手段,尝试使用vectorized solutions,在这种情况下.loc 或np.where,与循环相比,它们在速度方面表现更好。

    【讨论】:

    • 感谢您分享这个!将范式转换为矢量化编码方式对我来说是一条学习曲线。
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-06-08
    • 2017-01-15
    相关资源
    最近更新 更多