Для подсчета количества значений, отличных от 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