Почему я получаю nan как строку при использовании np.nan и пропущенное значение при использовании pd.NA? - PullRequest
4 голосов
/ 06 марта 2020

Извините, я не могу поделиться данными. Я пытался создать тестовые данные, но они не выдают такую ​​же ошибку или другие пропущенные значения, как описано ниже.

В нижней части добавлена ​​дополнительная информация о pd.NA

Я загружаю данные с кодом:

df = pd.read_csv("C:/data.csv")

При загрузке данных я получаю это предупреждение:

C:\Users\User1\AppData\Local\Continuum\anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3063: DtypeWarning: Columns (162,247,274,292,304,316,321,335,345,347,357,379,389,390,393,395,400,401,420,424,447,462,465,467,478,481,534,536,538,570,616,632,653,666,675,691,707,754,758,762,766,770,774,778,782,784,785,786,788,789,790,792,793,794,796,797,798,800,801,802,804,805,806,808,809,810,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,867,868,871,872,875,876,880,1367,1368,1370,1371,1373,1374,1376,1377,1379,1380,1382,1383,1385,1386,1388,1389,1391,1392,1394,1395,1397,1398,1400,1401,1403,1404,1406,1407,1409,1410,1412,1413,1415,1416,1418,1419,1421,1422,1424,1425,2681) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

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

После того, как я запускаю этот код с здесь :

Недавно созданные столбцы и исполняемый код выше содержат nan но столбцы, загруженные из csv файла, содержат NaN.

После запуска df['var1'].value_counts(dropna=False), я получаю вывод:

NaN    3453
0.0    3002
1.0     314
Name: var1, dtype: int64

После запуска df['Result1'].value_counts(dropna=False), я получаю вывод:

0.0            3655
nan            2665
1.0             407
Both values      42
Name: Result1, dtype: int64

Обратите внимание, что var1 содержит NaN значений, но Result1 содержит nan значений.

Когда я запускаю df['var1'].value_counts(dropna=False).loc[[np.nan]], я получаю вывод:

NaN    3453
Name: weeklyivr_q1, dtype: int64

Когда я запускаю df['Result1'].value_counts(dropna=False).loc[[np.nan]] Я получаю сообщение об ошибке (имена переменных в ошибке разные, но ключевая идея заключается в том, что нет ошибок значения нг):

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-52-0daeac75fdb4> in <module>
     27 #combined_IVR["weeklyivr_q1"].value_counts(dropna=False)
     28 #combined_IVR["my_weekly_ivr_1"].value_counts(dropna=False).loc[["Both values"]]
---> 29 combined_IVR["my_weekly_ivr_1"].value_counts(dropna=False).loc[[np.nan]]
     30 #combined_IVR["weeklyivr_q1"].value_counts(dropna=False).loc[[np.nan]]

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
   1764 
   1765             maybe_callable = com.apply_if_callable(key, self.obj)
-> 1766             return self._getitem_axis(maybe_callable, axis=axis)
   1767 
   1768     def _is_scalar_access(self, key: Tuple):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis)
   1950                     raise ValueError("Cannot index with multidimensional key")
   1951 
-> 1952                 return self._getitem_iterable(key, axis=axis)
   1953 
   1954             # nested tuple slicing

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py in _getitem_iterable(self, key, axis)
   1591         else:
   1592             # A collection of keys
-> 1593             keyarr, indexer = self._get_listlike_indexer(key, axis, raise_missing=False)
   1594             return self.obj._reindex_with_indexers(
   1595                 {axis: [keyarr, indexer]}, copy=True, allow_dups=True

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py in _get_listlike_indexer(self, key, axis, raise_missing)
   1549 
   1550         self._validate_read_indexer(
-> 1551             keyarr, indexer, o._get_axis_number(axis), raise_missing=raise_missing
   1552         )
   1553         return keyarr, indexer

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py in _validate_read_indexer(self, key, indexer, axis, raise_missing)
   1636             if missing == len(indexer):
   1637                 axis_name = self.obj._get_axis_name(axis)
-> 1638                 raise KeyError(f"None of [{key}] are in the [{axis_name}]")
   1639 
   1640             # We (temporarily) allow for some missing keys with .loc, except in

KeyError: "None of [Float64Index([nan], dtype='float64')] are in the [index]"

Когда я бегу df['Result1'].value_counts(dropna=False).loc[['nan']] я получаю:

nan    2665
Name: my_weekly_ivr_1, dtype: int64

Так что nan в столбце 'Result1' является строкой.

Если я заменю choices = ["Both values", np.nan, df[col1], df[col2]] на choices = ["Both values", pd.NA, df[col1], df[col2]] и после запуска:

df['Result1'].value_counts(dropna=False).loc[[np.nan]]

Я получаю вывод:

NaN    2665
Name: Result1, dtype: int64

Так что в этом случае np.nan выдает строку и pd.NA пропущенное значение.


Вопрос:

Почему я получаю nan в столбце «Результат1», когда используя np.nan? В чем может быть причина и как это исправить?

...