Панды вычитают дату и время - PullRequest
0 голосов
/ 05 июня 2018

Я хотел бы пройтись по циклу данных и вычесть дату и время, только если идентификатор совпадает в каждой строке.Однако, как показано в примере ниже, цикл 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)

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете использовать groupby diff, после получения результата concat вернуть обратно

s=df_so_ex2.groupby('ID').apply(lambda x : pd.DataFrame({'Days_since':x['DateOf'].diff().dt.days,'Chg_avg_value':x['Avg. Value'].diff()}))
pd.concat([df_so_ex2,s],axis = 1)
Out[460]: 
       Avg. Value  Count     DateOf   ID  Chg_avg_value  Days_since
Index                                                              
0             4.4      4 2017-08-01  553            NaN         NaN
1             3.0      1 2017-08-03  553           -1.4         2.0
2             5.3      3 2017-08-04  553            2.3         1.0
3             6.4      4 2017-08-07  559            NaN         NaN
4             5.0      9 2017-08-09  559           -1.4         2.0
5             4.2     11 2017-08-11  559           -0.8         2.0
6             3.5      4 2017-08-12  559           -0.7         1.0
7             2.0      2 2017-08-02  914            NaN         NaN
8             3.3     10 2017-08-04  914            1.3         2.0
9             2.2      5 2017-08-07  914           -1.1         3.0
0 голосов
/ 05 июня 2018

Использование groupby + pd.Series.diff:

g = df_so_ex2.groupby('ID')

df_so_ex2['Chg_avg_value'] = g['Avg. Value'].apply(pd.Series.diff)
df_so_ex2['Days_since'] = g['DateOf'].apply(pd.Series.diff).dt.days

print(df_so_ex2)

       Avg. Value  Count     DateOf   ID  Chg_avg_value  Days_since
Index                                                              
0             4.4      4 2017-08-01  553            NaN         NaN
1             3.0      1 2017-08-03  553           -1.4         2.0
2             5.3      3 2017-08-04  553            2.3         1.0
3             6.4      4 2017-08-07  559            NaN         NaN
4             5.0      9 2017-08-09  559           -1.4         2.0
5             4.2     11 2017-08-11  559           -0.8         2.0
6             3.5      4 2017-08-12  559           -0.7         1.0
7             2.0      2 2017-08-02  914            NaN         NaN
8             3.3     10 2017-08-04  914            1.3         2.0
9             2.2      5 2017-08-07  914           -1.1         3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...