Есть ли способ сохранить значения nan при использовании сводной таблицы в Pandas? - PullRequest
2 голосов
/ 10 июля 2020

У меня возникла проблема с функцией pandas pivot_table и тем, как она работает со значениями NaN. Пример того, как pandas работает с NaN, приведен ниже:

import pandas as pd

dataframe = pd.DataFrame([[1, 1, 23501, 1000], 
                          [2, 1, 23501, 1000], 
                          [3, None, None, None], 
                          [4, 1, 23501, 1000]], 
                          columns=['A','B' , 
                                   'C', 'D'])

dataframe = dataframe.reset_index().pivot_table(index = ['index', 'A'], columns = ['B'])
print(dataframe)

Результат:

                      C            D
B                     1.0          1.0
index A                        
0     1           23501.0       1000.0
1     2           23501.0       1000.0
3     4           23501.0       1000.0

Проблема с этим подходом заключается в том, что pivot_table полностью удаляет строку, заполненную значениями NaN. . Я посмотрел, что pivot_table имеет флаг dropna, но результат, полученный при использовании, является странным и по-прежнему исключает значения NaN индекса 2.

Результат с dropna:

                      C            D
B                     1.0          1.0
index A                        
0     1           23501.0       1000.0
      2               NaN          NaN
      4               NaN          NaN
1     1               NaN          NaN
      2           23501.0       1000.0
      4               NaN          NaN
3     1               NaN          NaN
      2               NaN          NaN
      4           23501.0       1000.0

Я посмотрел на эту страницу github: https://github.com/pandas-dev/pandas/issues/18030, и при попытке одного из решений, измененных для меня (я думаю), это df.groupby(["A", "B"]).agg('first').unstack([1]), он дает мне тот же результат, что и простая сводная таблица.

Есть ли возможное решение с использованием других функций pandas, чтобы сохранить значения nan при повороте, чтобы создать что-то вроде:

                      C            D
B                     1.0          1.0
index A                         
0     1           23501.0       1000.0
1     2           23501.0       1000.0
2     3           NaN              NaN
3     4           23501.0       1000.0

Спасибо за помощь

1 Ответ

2 голосов
/ 10 июля 2020

Добавьте в индекс дополнительные уровни, а затем unstack 'B'. Это создаст уровень NaN, который нам не нужен, поэтому мы его отфильтруем.

Если хотите, вы можете использовать 'Int64' dtype для 'B', который сохранит значения уровня np.int64 1 в отличие от float.

df.index.name = 'index'  # level will have a name now
# df['B'] = df['B'].astype('Int64') # prevents upcasting
df = df.set_index(['A', 'B'], append=True).unstack(-1)
df = df.loc[:, df.columns.get_level_values('B').notnull()]
               C       D
B            1.0     1.0
index A                 
0     1  23501.0  1000.0
1     2  23501.0  1000.0
2     3      NaN     NaN
3     4  23501.0  1000.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...