Почему NaN в сводной таблице? - PullRequest
3 голосов
/ 30 октября 2019

Я удалил все NaN из df, используя df = df.fillna(0).

После того, как я создал сводную таблицу, используя

pd.pivot_table(df, index='Source', columns='Customer Location', values='Total billed £')

, я все равно снова получаю данные NaN в качестве вывода.

Может кто-нибудь объяснить мне, почему и как предотвратить этот вывод и почему это происходит?

Ответы [ 2 ]

3 голосов
/ 30 октября 2019

Из-за ваших входных данных один столбец преобразуется в индекс, а значения другого - в столбцы. Пересечение этих агрегированных значений. Но если во входных данных не существует некоторых комбинаций, это приведет к отсутствию данных (NaN).

df = pd.DataFrame({
        'Source':list('abcdef'),
         'Total billed £':[5,3,6,9,2,4],
         'Customer Location':list('adfbbb')
})

print (df)
  Source  Total billed £ Customer Location
0      a               5                 a
1      b               3                 d
2      c               6                 f
3      d               9                 b
4      e               2                 b
5      f               4                 b

#e.g because `Source=a` and `Customer Location=b` not exist in source then NaN in output
print (pd.pivot_table(df,index='Source', columns='Customer Location',values='Total billed £'))
Customer Location    a    b    d    f
Source                               
a                  5.0  NaN  NaN  NaN
b                  NaN  NaN  3.0  NaN
c                  NaN  NaN  NaN  6.0
d                  NaN  9.0  NaN  NaN
e                  NaN  2.0  NaN  NaN
f                  NaN  4.0  NaN  NaN

Кроме того, здесь хорошее чтение для reshaping data.

2 голосов
/ 30 октября 2019

Причина проста - в ваших данных отсутствует пара (индекс, столбец) значений, например:

df = pd.DataFrame({"Source": ["foo", "bar", "bar", "bar"],
                   "Customer Location": ["one", "one", "two", "two", ],
                   "Total billed £": [10, 20, 30, 40]})

print(df)

Настройка

  Source Customer Location  Total billed £
0    foo               one              10
1    bar               one              20
2    bar               two              30
3    bar               two              40

Как вы можете видеть, в ваших данных нет пары ('foo', 'two'), поэтому когда вы делаете:

result = pd.pivot_table(df, index='Source', columns='Customer Location', values='Total billed £')
print(result)

Вывод

Customer Location   one   two
Source                       
bar                20.0  35.0
foo                10.0   NaN

Для устранения проблемы укажите значение по умолчанию с помощью параметра fill_value:

result = pd.pivot_table(df, index='Source', columns='Customer Location', values='Total billed £', fill_value=0)

Выход

Customer Location  one  two
Source                     
bar                 20   35
foo                 10    0
...