Слияние кросс-таблицы панд с таблицей данных и получение частичных результатов - PullRequest
0 голосов
/ 09 октября 2019

У меня в прошлом были объединенные результаты кросс-таблицы с моими данными без проблем, но сегодня это не что иное, как ошибки и разочарования.

У меня есть такой список:

TID PL Amount Category
--- -- ------ --------
1   A      10 Hardware
1   B      15 Software
2   C      50 Service

Я используюct = pd.crosstab(data['TID'], columns=data['Category'], values=data['Amount'], aggfunc='sum').fillna(0) и получить

Category  Hardware  Software  Support
TID
--------  --------  --------  -------
1             10.0      15.0      0.0
2              0.0       0.0     50.0

Затем я объединяю свои учетные записи:

TID  Name
---  ----
  1  This
  2  That

с pd.merge(accounts, ct, on="TID", how="left") и получаю ожидаемый результат:

TID  Name  Hardware  Software  Support
---  ----  --------  --------  -------
  1  This      10.0      15.0      0.0
  2  That       0.0       0.0     50.0

Это работаетв записной книжке Jupyter без проблем.

К сожалению, в реальном файле (полном проприетарных данных) fillna(0) в кросс-таблице не заменяет NaN, поэтому мне нужно вручную запустить fillna вСтолбцы «Оборудование», «Программное обеспечение» и «Поддержка». Затем, когда я пытаюсь получить итоговый столбец data['Total'] = data['Hardware'] + data['Software'] + data['Services'], я получаю ошибку length of values does not match length of index.

Если я использую margins и margins_name параметры crosstab, я получаю ошибку во время слияния:

You are trying to merge on int64 and object columns. If you wish to proceed you should use pd.concat

Я не могу понять, как преобразовать индекс кросс-таблицы как int64.

Я не могу понять, как сгладить кросс-таблицу в обычный фрейм данных сстолбцы 'TID', 'Name', 'Hardware', 'Software', 'Service', 'Total'. reset_index выглядит правильно, но тогда я все еще не могу привести этот столбец как int64 и выполнить объединение.

Есть предложения? Обидно, что я не могу воспроизвести эту ошибку за пределами моего кода.

1 Ответ

1 голос
/ 09 октября 2019

Я вижу Здесь , что кросс-таблица по умолчанию отбрасывает значения NaN dropna=True.

Похоже, вы не сможете fillna() значения NaN, которые никогда не заполнялись, а также приводитьна длины не совпадают. Я бы попробовал:

ct = pd.crosstab(data['TID'], columns=data['Category'], values=data['Amount'], aggfunc='sum', dropna=False).fillna(0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...