如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?
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
,在这种情况下.loc
或np.where
,与循环相比,它们在速度方面表现更好。
【讨论】:
感谢您分享这个!将范式转换为矢量化编码方式对我来说是一条学习曲线。以上是关于如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?的主要内容,如果未能解决你的问题,请参考以下文章