Рассчитать проценты ненулевых значений нескольких столбцов в Pandas - PullRequest
1 голос
/ 19 сентября 2019

Для фрейма данных следующим образом, как я могу вычислить not-null values 'процентное содержание столбцов A, C, D в Pandas?Спасибо.

   id     A      B     C     D
0   1   1.0    one   4.0   NaN
1   2   NaN    one  14.0   NaN
2   3   2.0    two   3.0 -12.0
3   4  55.0  three   NaN  12.0
4   5   6.0    two   8.0  12.0
5   6   NaN    two   7.0 -12.0
6   7 -17.0    one   NaN   NaN
7   8   NaN  three  11.0   NaN

Ожидаемый результат такой:

              id      A      B      C      D
0  not-nulls_pct  62.5%    NaN  75.0%  50.0%
1              1      1    one      4    NaN
2              2    NaN    one     14    NaN
3              3      2    two      3    -12
4              4     55  three    NaN     12
5              5      6    two      8     12
6              6    NaN    two      7    -12
7              7    -17    one    NaN    NaN
8              8    NaN  three     11    NaN

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Для подсчета количества значений, отличных от NaN, используйте DataFrame.notna с DataFrame.mean.

Затем необходимо заменить 100% на пропущенные значения, одно из возможныхрешение с Series.mask - вернуть NaN с по умолчанию, затем создать одну строку DataFrame с Series.to_frame и транспонировать и предварять на concat, последнее установленное первое значение id по пользовательскому значению:

s = df.notna().mean()
df1 = s.mul(100).astype(str).add('%').mask(s == 1).to_frame().T
df = pd.concat([df1, df], ignore_index=True)

df.loc[0, 'id'] = 'not-nulls_pct'
print (df)
              id      A      B      C      D
0  not-nulls_pct  62.5%    NaN  75.0%  50.0%
1              1      1    one      4    NaN
2              2    NaN    one     14    NaN
3              3      2    two      3    -12
4              4     55  three    NaN     12
5              5      6    two      8     12
6              6    NaN    two      7    -12
7              7    -17    one    NaN    NaN
8              8    NaN  three     11    NaN

Или используйте setting with enlargement с loc, тогда необходим индекс сортировки для первой строки в финале DataFrame:

s = df.notna().mean()
df.loc[-1] = np.where(s != 1, s.mul(100).astype(str).add('%'), np.nan)
df = df.sort_index().reset_index(drop=True)
df.loc[0, 'id'] = 'not-nulls_pct'
print (df)
              id      A      B      C      D
0  not-nulls_pct  62.5%    NaN  75.0%  50.0%
1              1      1    one      4    NaN
2              2    NaN    one     14    NaN
3              3      2    two      3    -12
4              4     55  three    NaN     12
5              5      6    two      8     12
6              6    NaN    two      7    -12
7              7    -17    one    NaN    NaN
8              8    NaN  three     11    NaN
1 голос
/ 19 сентября 2019
df.loc['per'] = ((df.count()/df.shape[0])*100).round(2).astype(str).add('%')

выход

    id      A      B      C     D
0   1       1      one    4     NaN
1   2       NaN    one    14    NaN
2   3       2      two    3     -12
3   4       55     three  NaN   12
4   5       6      two    8     12
5   6       NaN    two    7     -12
6   7       -17    one    NaN   NaN
7   8       NaN    three  11    NaN
per 100.0%  62.5%  100.0% 75.0% 50.0%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...