Как перебрать pandas dataframe и условно присвоить значения строке переменной? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь просмотреть цикл данных 'vol' и условно проверить, находится ли образец_даты между определенными датами.Если это так, присвойте значение другому столбцу.

Вот следующий код, который у меня есть:

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' являются изменяемыми, поэтому онинельзя хешировать

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Другой способ сделать это - использовать метод np.where из модуля numpy в сочетании с методом .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, они будут работать лучше с точки зрения скорости по сравнению с циклом.

0 голосов
/ 29 января 2019

Вот как бы вы сделали это правильно:

cond = (pd.Timestamp('2015-11-03') <= vol.sample_date) & 
       (vol.sample_date <= pd.Timestamp('2018-06-07'))

vol.loc[cond, 'hydraulic_vol'] = 319779
...