Pandas: как увеличить элемент в одном столбце на основе количества элементов в другом столбце? - PullRequest
0 голосов
/ 08 января 2020

У меня есть фрейм данных 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? Любая помощь приветствуется, спасибо.

1 Ответ

2 голосов
/ 08 января 2020

Я бы выбрал следующий подход:

Итерация по строкам кадра данных, если процентная доля объекта не равна нулю:
Если сумма процентной доли субъекта не равна 100:
объединить требуемый процент, чтобы сделать его 100
объединить '; 0' с кодом субъекта

реализация:

for index, row in df.iterrows():
    if pd.isnull(row['subject-percentage']):
        continue
    total = sum(map(int,row['subject-percentage'].split(';')))
    if total != 100:
        df.loc[index, 'subject-percentage'] = row['subject-percentage'] + ';{}'.format(100-total)
        df.loc[index, 'subject-code'] = row['subject-code'] + ';0'

subject-percentage   subject-code
0        10;40;40;10  101;202;303;0
1                NaN            NaN
2           25;25;50    404;505;606
3                NaN            NaN
4           50;40;10      707;808;0
5           20;60;20    909;10010;0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...