如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

Posted

技术标签:

【中文标题】如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?【英文标题】: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' 对象是可变的,因此它们不能被散列

【问题讨论】:

【参考方案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,在这种情况下.locnp.where,与循环相比,它们在速度方面表现更好。

【讨论】:

感谢您分享这个!将范式转换为矢量化编码方式对我来说是一条学习曲线。

以上是关于如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将子字符串复制到熊猫数据框的新列中?

R:将值分配给数据框中的动态变量时遇到问题

熊猫,我怎样才能避免使用 iterrow (如何根据来自另一个数据帧的值将值分配给数据帧中的新列)

循环遍历熊猫中的行[重复]

如何正确地将值分配给数组(结构类型)元素?

根据带有if条件的多个文本框值将值分配给表单上的文本框-MS ACCESS