Несоответствующие столбцы: Добавьте новую строку и замените на N/A, если дата для этих данных не существует (python)

#python #dataframe #jupyter

Вопрос:

У меня есть очень большой набор данных с информацией в разных столбцах в формате ниже.

     DATE        Data    DATE.2      Data2   DATE.3      Data3   DATE.4      Data4 Data5
0   2018-01-01  2.4054  2018-01-02  9.77    2018-01-02  2695.81 2018-01-01  98  358
1   2018-01-02  2.4633  2018-01-03  9.15    2018-01-03  2713.06 2018-01-02  98  355
2   2018-01-03  2.4471  2018-01-04  9.22    2018-01-04  2723.99 2018-01-03  99  348
3   2018-01-04  2.4525  2018-01-05  9.22    2018-01-05  2743.15 2018-01-04  98  340
4   2018-01-05  2.4763  2018-01-08  9.52    2018-01-08  2747.71 2018-01-05  98  336
5   2018-01-08  2.4800  2018-01-09  10.08   2018-01-09  2751.29 2018-01-08  97  335
6   2018-01-09  2.5530  2018-01-10  9.82    2018-01-10  2748.23 2018-01-09  96  333
 

Я прохожу процесс очистки, и мне нужно, чтобы там была только одна колонка с датой вместо 4. Как вы можете видеть из данных, даты не совпадают в каждой строке, поэтому мне нужно разработать способ получения кода для создания новой строки с N/A в ней, если в соответствующем столбце даты за этот день нет данных.

Например, мне нужен код для написания:

     DATE        Data     Data2    Data3  Data4 Data5
0   2018-01-01  2.4054   N/A      N/A     98   358
1   2018-01-02  2.4633   9.77     2695.81 98   355
 

Кто-нибудь знает, как этого добиться? Заранее спасибо за любые советы/указания.

Ответ №1:

Есть много способов добиться этого.

Вы можете попробовать создать новый фрейм данных, используя свой набор данных.

  1. Создайте новый фрейм данных с датой столбца и вставьте все даты (дата.2, дата.3 и т.д.) В свой столбец из старого df (фрейм данных).
  2. Удалите дубликаты в этом столбце (если они существуют)
  3. Затем создайте столбцы Data, Data2, Data3, Data4 со значением по умолчанию N/A.
  4. Выберите значения Data, Data2, Data3, Data4, где (данные == new_df.дата ИЛИ данные.2 == new_df.дата …..)

Функции для этих шагов доступны в pandas.

Комментарии:

1. Привет, glory9211, спасибо за совет до сих пор; это было очень полезно. Я немного застрял на пункте 4. Все, что я делаю, в той или иной форме приводит к ошибке. Я попробовал это (новый-это новый фрейм данных): новый[‘Данные’] = np.где(новый[‘Новая дата’] == df[‘ДАТА’], df[‘Данные’]), и он выдает ошибку. У тебя есть какие-нибудь идеи, как это исправить?

2. Можете ли вы поделиться сообщением об ошибке ?

3. Из вашего сообщения я вижу, что вы не определили параметр «y», общий синтаксис-np.where(условие[ x, y]). x выбирается, если условие истинно, иначе y. Читайте примеры здесь geeksforgeeks.org/numpy-where-in-python

4. В конце концов мне удалось разобраться с этим, спасибо за ваши указания.

Ответ №2:

В конце концов мне удалось с этим разобраться:

 df_1 = af[['DATE', 'Data']]
df_2 = af[['DATE.2', 'Data2']].rename(columns = {'DATE.2': 'DATE'})
df_3 = af[['DATE.3', 'Data3']].rename(columns = {'DATE.3': 'DATE'})
df_4 = af[['DATE.4', 'Data4', 'Data5']].rename(columns = {'DATE.4': 'DATE'})

new = df_1.merge(df_2, on = 'DATE', how = 'outer').merge(df_3, on = 'DATE', how = 'outer').merge(df_4, on = 'DATE', how = 'outer')
new['Data'].fillna("N/A", inplace = True)
new['Data2'].fillna("N/A", inplace = True)
new['Data3'].fillna("N/A", inplace = True)
new['Data4'].fillna("N/A", inplace = True)
new['Data5'].fillna("N/A", inplace = True)
new