Это что-то вроде c, но я постараюсь сократить его до некоторых конкретных c вопросов.
Начиная отвечать на вопросы по SO, я обнаружил, что иногда сталкиваюсь с такая глупая ошибка при создании игрушечных данных:
In[0]:
import pandas as pd
df = pd.DataFrame({"values":[1,2,3,4,5,6,7,8,9]})
df[df < 5] = np.nan
Out[0]:
NameError: name 'np' is not defined
Я настолько привык автоматически импортировать numpy
с pandas
, что обычно этого не происходит в реальном коде. Однако это заставило меня задуматься, почему pandas
не имеет собственного значения / объекта для представления нулевых значений.
Я только недавно понял, что вы можете просто использовать Python None
вместо аналогичная ситуация:
import pandas as pd
df = pd.DataFrame({"values":[1,2,3,4,5,6,7,8,9]})
df[df < 5] = None
Что работает должным образом и не вызывает ошибок. Но я чувствовал, что соглашение о SO, которое я видел, заключается в использовании np.nan
, и что люди обычно ссылаются на np.nan
при обсуждении нулевых значений (возможно, поэтому я не понял, что None
можно использовать , но, возможно, это была моя собственная идиосинкразия).
Кратко рассмотрев это, я теперь увидел, что pandas
действительно имеет значение pandas.NA
с 1.0.0, но Я никогда не видел, чтобы кто-нибудь использовал его в сообщениях :
In[0]:
import pandas as pd
import numpy as np
df = pd.DataFrame({'values':np.random.rand(20,)})
df['above'] = df['values']
df['below'] = df['values']
df['above'][df['values']>0.7] = np.nan
df['below'][df['values']<0.3] = pd.NA
df['names'] = ['a','b','c','a','b','c','a','b','c','a']*2
df.loc[df['names']=='a','names'] = pd.NA
df.loc[df['names']=='b','names'] = np.nan
df.loc[df['names']=='c','names'] = None
df
Out[0]:
values above below names
0 0.323531 0.323531 0.323531 <NA>
1 0.690383 0.690383 0.690383 NaN
2 0.692371 0.692371 0.692371 None
3 0.259712 0.259712 NaN <NA>
4 0.473505 0.473505 0.473505 NaN
5 0.907751 NaN 0.907751 None
6 0.642596 0.642596 0.642596 <NA>
7 0.229420 0.229420 NaN NaN
8 0.576324 0.576324 0.576324 None
9 0.823715 NaN 0.823715 <NA>
10 0.210176 0.210176 NaN <NA>
11 0.629563 0.629563 0.629563 NaN
12 0.481969 0.481969 0.481969 None
13 0.400318 0.400318 0.400318 <NA>
14 0.582735 0.582735 0.582735 NaN
15 0.743162 NaN 0.743162 None
16 0.134903 0.134903 NaN <NA>
17 0.386366 0.386366 0.386366 NaN
18 0.313160 0.313160 0.313160 None
19 0.695956 0.695956 0.695956 <NA>
Кажется, что для числовых значений различие между этими разными нулевыми значениями не имеет значения, но они представлены по-разному для строки (и, возможно, для других типов данных?).
Мои вопросы, основанные на приведенном выше :
- Принято ли использовать
np.nan
(вместо None
) для представления нулевых значений в pandas
? - Почему
pandas
не имело собственного нулевого значения большую часть своего существования (до прошлого года)? Что было мотивацией для добавления? - В случаях, когда вы можете иметь несколько типов пропущенных значений в одном
Series
или столбце, есть ли между ними разница? Почему они не представлены одинаково (как с числовыми данными)?
Я полностью предвижу, что у меня может быть неправильная интерпретация вещей и различие между pandas
и numpy
, поэтому, пожалуйста, поправьте меня .