Фрейм данных Pandas извлекает данные в новый столбец, пропуская пустые значения - PullRequest
0 голосов
/ 04 июня 2018

У меня есть функция, которая успешно работает для извлечения данных из кадра данных, когда он выглядит следующим образом:

company                            created_at              notes
{'id': 'eb904b4b', 'name': 'B'}    2018-06-04T13:57:02Z    Digging Holes
{'id': 'da2dc806', 'name': 'K'}    2018-06-04T13:57:02Z    Drinking Tea
{'id': 'eb904b4b', 'name': 'B'}    2018-05-11T08:52:23Z    Cbales
{'id': '3d38dcb7', 'name': 'B'}    2018-05-11T08:52:23Z    Digg

Чтобы получить это:

company_id  company_name    created_at              notes
eb904b4b    B               2018-06-04T13:57:02Z    Digging Holes
da2dc806    K               2018-06-04T13:57:02Z    Drinking Tea
eb904b4b    B               2018-05-11T08:52:23Z    Cbales
3d38dcb7    B               2018-05-11T08:52:23Z    Digg

Однако, если столбец компанииимеет пустое значение, то функция завершается ошибкой, поскольку она ожидает значение.Я не могу понять, как заставить мой код пропускать пропуски и продолжать ...

Например:

company                            created_at              notes
{'id': 'eb904b4b', 'name': 'B'}    2018-06-04T13:57:02Z    Digging Holes
                                   2018-06-04T13:57:02Z    Drinking Tea
{'id': 'eb904b4b', 'name': 'B'}    2018-05-11T08:52:23Z    Cbales
{'id': '3d38dcb7', 'name': 'B'}    2018-05-11T08:52:23Z    Digg

Код, который работает для полного кадра, выглядит так:

def shallow_extract(column, df_parent):
    temp_frame = pandas.DataFrame(x for x in df_parent[column])
    temp_frame.columns = [f"{column}_{str(col)}" for col in temp_frame.columns]
    return pandas.concat([df_parent.drop([column], axis=1), temp_frame.apply(pandas.Series)], axis=1)

РЕДАКТИРОВАТЬ: удаление строк не вариант, так как другие поля могут содержать необходимые данные.Код также должен иметь возможность принимать несколько фреймов данных с разными позициями и именами столбцов для извлечения (как указано вторым параметром в функции)

1 Ответ

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

Вы можете значительно упростить расширение словаря, используя df.company.apply(pd.Series).Однако, если в вашем DataFrame есть пустые строки, при использовании этого метода будет создан пустой столбец NaN, который вам нужно отбросить.

Setup :

{'company': [{'id': 'eb904b4b', 'name': 'B'},
  {'id': 'da2dc806', 'name': 'K'},
  {'id': 'eb904b4b', 'name': 'B'},
  {'id': '3d38dcb7', 'name': 'B'},
  ''],
 'created_at': ['2018-06-04T13:57:02Z',
  '2018-06-04T13:57:02Z',
  '2018-05-11T08:52:23Z',
  '2018-05-11T08:52:23Z',
  '2018-05-11T08:52:23Z'],
 'notes': ['Diggin holes', 'Drinking Tea', 'Cbales', 'Digg', 'Other']}

Вы можете использовать эту полезную функцию, чтобы делать то, что вы хотите (я использовал errors='ignore', если при развертывании нет пустых столбцов):

def explode_deplode(column, df):
    return df.join(df[column]                      \
    .apply(pd.Series).drop(0, 1, errors='ignore')  \
    .add_prefix('{}_'.format(column)))             \
    .drop(column, 1)

В действии:

explode_deplode('company', df)

             created_at         notes company_id company_name
0  2018-06-04T13:57:02Z  Diggin holes   eb904b4b            B
1  2018-06-04T13:57:02Z  Drinking Tea   da2dc806            K
2  2018-05-11T08:52:23Z        Cbales   eb904b4b            B
3  2018-05-11T08:52:23Z          Digg   3d38dcb7            B
4  2018-05-11T08:52:23Z         Other        NaN          NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...