У меня есть фрейм данных df с 2 полями - процент субъекта и код субъекта .
Оба имеют много значений NaN
, Теперь я хочу убедиться, что количество элементов в поле subject-процент * равно 100 в каждой строке. Если этого не произойдет, я бы хотел добавить новый элемент в поле subject-процент * , равное 100 - sum(elements in subject-percentage column)
. При этом я также хочу добавить фиктивный элемент (скажем, «0») в столбец subject-code , чтобы в любой момент времени количество элементов в обоих этих столбцах было одинаковым для каждой записи.
Вот пример кадра данных:
In[1] : df = pd.DataFrame({'subject-percentage':['10;40;40', np.nan,'25;25;50',np.nan,'50;40','20;60'],\
'subject-code':['101;202;303',np.nan,'404;505;606',np.nan,'707;808','909;10010']})
In[2] : df
Out[2]: subject-percentage subject-code
0 10;40;40 101;202;303
1 NaN NaN
2 25;25;50 404;505;606
3 NaN NaN
4 50;40 707;808
5 20;60 909;10010
Ниже приведен код, который я использовал для заполнения пропущенного элемента из subject-процент * , чтобы сделать сумму все элементы в каждой строке равны 100:
In [3]:def make_it_100(values):
arr= []
for value in values.split(';'):
arr.append(int(value))
arr = numpy.array(arr)
if arr.sum() != 100:
corrected_arr = numpy.append(arr, [100 - arr.sum()])
corrected_arr = [str(a) for a in corrected_arr]
return ';'.join(corrected_arr)
else:
return values
In [4]:df.loc[~df['sector-percentage'].isna(), 'subject-percentage'] = df.loc[~df['sector-percentage'].isna(), \
'subject-percentage'].apply(lambda x: make_it_100(x))
Но теперь два столбца не имеют равных нет. элементов в каждом ряду. Поэтому я хочу добавить '0'
в конец строк, где длина субъект-код меньше, чем длина субъект-процент . Я попробовал простую конкатенацию ';0'
в конце строк в subject-code после разрезания этих строк, где длина subject-code меньше subject-процентных но потом я получаю ошибку 'float' object has no attribute 'len'
.
Может кто-нибудь сказать мне более эффективный способ выполнить ту же задачу в одном go? Любая помощь приветствуется, спасибо.