Как вычислить различные диапазоны квантилей столбцов в кадре данных на основе процента пропущенных значений? - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь вычислить квантили столбцов A и B из кадра данных df, но я хотел бы рассчитать различные квантили в соответствии с процентом пропущенного значения этих столбцов.

df = pd.DataFrame({'A': ['Bob', 'Jane', 'Alice', NA, NA, NA, 'Rob', 'Max'], 
                   'B': ['Example', NA, NA, 'Test', 'Check', NA, NA, NA]})

Дополнительно, так какA и B представлены в символьном формате, я хотел бы сначала посчитать длину каждой строки для каждого столбца, чтобы

df_count = pd.DataFrame({'A': [3, 4, 5, 0, 0, 0, 3, 3], 
                       'B': [7, 0, 0, 4, 5, 0, 0, 0]})

, и только затем вычислить квантили для новых значений A и B в соответствии спроцент пропущенных значений.

Например, если процент пропущенных значений столбца A превышает 90%, я бы хотел вычислить квантиль (0,99), иначе, если процент пропущенных значений столбцаA меньше 90%, я бы хотел вычислить квантиль (0,10).

В качестве последнего шага я бы записал значения квантилей в новый фрейм данных:

df_quant = pd.DataFrame({'A_quant': [quantile_value_for_A], 
                       'B_quant': [quantile_value_for_B]})

Есть ли способ сделать это? Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 28 октября 2019

Использование:

df = pd.DataFrame({'A': ['Bob', 'Jane', 'Alice', np.nan,np.nan, np.nan, 'Rob', 'Max'], 
                   'B': ['Example', np.nan, np.nan, 'Test', 'Check', np.nan, np.nan, np.nan]})

df_count = pd.DataFrame({'A': [3, 4, 5, 0, 0, 0, 3, 3], 
                       'B': [7, 0, 0, 4, 5, 0, 0, 0]})

#get percentage of NaNs
print (df.isna().mean())
A    0.375
B    0.625
dtype: float64

#compare by threshold, here 0.5 for test, with real data change to 0.9
thresh = .5
m = df.isna().mean() > thresh
print (m)
A    False
B     True
dtype: bool

#count both percentile
a = df_count.quantile(0.9999)
print (a)
A    4.9993
B    6.9986
Name: 0.9999, dtype: float64

b = df_count.quantile(0.999)
print (b)
A    4.993
B    6.986
Name: 0.999, dtype: float64

#set values by mask
out = np.where(m, a, b)
print (out)
[4.993  6.9986]

#create DataFrame
df_quant = pd.DataFrame([out], columns= m.index).add_suffix('_quant')
print (df_quant)
   A_quant  B_quant
0    4.993   6.9986
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...