Заменить значение NaN в таблице из кадра данных без изменения других значений - PullRequest
1 голос
/ 03 марта 2020

Я создал сводную таблицу из кадра данных, используемого ниже кода

table = pd.pivot_table(df_table, values=['KPI Amount Convert to USD'], index=['Customer Nick', 'Customer',
                                                                             'Customer Name', 'BSO Name', 'BSO Comment',
                                                                            'Pay Date, Recovery action, No pay schedule reason '],
                       columns=['Range'], aggfunc={'KPI Amount Convert to USD': np.sum}, margins=True,
                       margins_name='Grand Total')

, он прекрасно работает, но некоторые значения равны NaN (другие являются обычными числами)

, когда я использовал

table = table.replace(np.nan, '', regex=True)

значение NaN пусто, НО какое-то значение изменено на 3.0176e + 06, даже до того, как оно было 3017601.99.

У вас есть идеи, как заменить значение NaN, но сохранить формат int другого ?

спасибо за совет

Ответы [ 4 ]

3 голосов
/ 03 марта 2020

Проблема здесь в dtype (типе данных) столбца или, точнее, в базовом массиве numpy. Я предполагаю, что в вашем table кадре данных столбец, содержащий значения NaN, имеет тип с плавающей запятой (float64).

Если вы замените NaN на 0. Все будет хорошо, но если вы хотите написать там пустая строка, Pandas изменить dtype на object.

Кстати, 3.0176e + 06 - это просто другое представление 3017601.99, но я бы предположил, что значение не изменилось. Просто pandas использует другое представление для столбцов типа np.float64 и столбцов типа object.

Вы можете попросить использовать преобразование str по умолчанию для значений с плавающей запятой в столбцах object, установив соответствующие опция: pd.set_option('display.float_format', str)

Демо:

>>> pd.set_option('display.float_format', None)                # reset option
>>> df = pd.DataFrame([[3017601.99], [np.nan]], columns=['A'])
>>> df
            A
0  3017601.99
1         NaN
>>> df1 = df.fillna('')
>>> df1
            A
0  3.0176e+06
1            
>>> pd.set_option('display.float_format', str)      # set the option
>>> df1
           A
0 3017601.99
1           
>>> df.loc[0,'A'] == df1.loc[0,'A']
True
0 голосов
/ 03 марта 2020
  table = table.fillna('-')

или

  table = table.fillna(0)
0 голосов
/ 03 марта 2020

Это проблема форматирования - в основном, когда столбец в заданном типе, числа отображаются определенным образом.

Если в вашем столбце есть только числа с плавающей запятой (поэтому числа и np.nan вписываются в что), он будет отображать вещи одним способом.

Если в вашем столбце есть числа с плавающей точкой и строки (числа и ''), тогда для столбца dtype установлено значение "объект", и он по-разному отображает различные вещи, например большие числа с плавающей точкой. / ints

Вот почему df.fillna (0) работает (0 также является плавающим, поэтому dtype остается плавающим), но df.fillna ('') создает такое же изменение отображения.

фактическое значение не изменяется, например:

df.loc[2,0]
> 3017601.990
df.fillna('').loc[2,0] == df.fillna(0).loc[2,0]
> True
0 голосов
/ 03 марта 2020

Вы пробовали table = table.fillna ('')

...