Я хотел бы пройтись по циклу данных и вычесть дату и время, только если идентификатор совпадает в каждой строке.Однако, как показано в примере ниже, цикл for не работает.Все значения NAN все еще там, и я получаю предупреждение ниже.Я перепробовал много вариантов и не понимаю проблемы.
Я также дал код ниже для желаемого выходного кадра данных.После того, как я это исправлю, я бы хотел подготовить условия на основе столбца Days_since и назначить значения для Chg_avg_value на основе следующего условия: если запись Days_since равна NAN, то Chg_avg_value равна NAN;иначе вычтите среднее.Значение записи.
Большое спасибо.Я действительно борюсь с индексацией панд.
A value is trying to be set on a copy of a slice from a DataFrame
Исходный кадр данных:
df_so_dict={'Index':[0,1,2,3,4,5,6,7,8,9],'DateOf': ['2017-08-01','2017-08-03','2017-08-04', '2017-08-07','2017-08-09','2017-08-11','2017-08-12','2017-08-02','2017-08-04','2017-08-07'],
'ID': ['553','553','553','559','559','559','559','914','914','914'], 'Count': [4,1,3,4,9,11,4,2,10,5],
'Avg. Value': [4.4,3,5.3,6.4,5,4.2,3.5,2,3.3,2.2]
}
df_so_ex2=pd.DataFrame(df_so_dict)
df_so_ex2.set_index('Index',inplace=True)
df_so_ex2['DateOf'] = pd.to_datetime(df_so_ex2['DateOf'])
df_so_ex2.dtypes #ID is an object
Цикл:
new=1
prev=0
df_so_ex['Days_since']=np.nan
if df_so_ex.iloc[new]['ID'] == df_so_ex.iloc[prev]['ID']:
df_so_ex.iloc[new]['Days_since']=df_so_ex.iloc[new]['DateOf'] - df_so_ex.iloc[prev]['DateOf']
new+=1
prev+=1
else:
new+=1
prev+=1
print(new)
print(prev)
Требуемый кадр данных:
df_so_dict_ans={'Index':[0,1,2,3,4,5,6,7,8,9],'DateOf': ['2017-08-01','2017-08-03','2017-08-04', '2017-08-07','2017-08-09','2017-08-11','2017-08-12','2017-08-02','2017-08-04','2017-08-07'],
'ID': ['553','553','553','559','559','559','559','914','914','914'], 'Count': [4,1,3,4,9,11,4,2,10,5],
'Avg. Value': [4.4,3,5.3,6.4,5,4.2,3.5,2,3.3,2.2],
'Days_since':['nan',2,1,'nan',2,2,1,'nan',2,3],
'Chg_avg_value':['nan',-1.4,2.3,'nan',-1.4,-0.8,-0.7,'nan',1.3,-1.1]
}
df_so_ex_ans=pd.DataFrame(df_so_dict_ans)
df_so_ex_ans.set_index('Index',inplace=True)