首页 > 解决方案 > Pandas:如何根据另一列中的元素数量增加一列中的元素?

问题描述

我有一个带有 2 个字段的数据框df - subject-percentagesubject-code
两者都有很多NaN价值。现在我想确保主题百分比字段中的元素在每行中总计为 100。如果他们不这样做,那么我想在主题百分比字段中添加一个新元素,该元素等于100 - sum(elements in subject-percentage column). 这样做,我还想在主题代码列中添加一个虚拟元素(例如“0”),以便在任何时间点,这两个列中的元素数量对于每条记录都是相同的。

这是数据框的示例:

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-percentage中填充缺失元素的代码,以使每行中所有元素的总和等于 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))

但是现在这两列不等于没有。每行中的元素。所以我想要的是在subject-code的长度小于subject-percentage'0'的长度的行末尾添加 a 。在将这些行切片后,我尝试在主题代码的行末尾进行简单的连接,其中主题代码的长度';0'的长度小于主题百分比但随后出现'float' object has no attribute 'len'.

有人可以告诉我一次性完成相同任务的更有效方法吗?任何帮助表示赞赏,谢谢。

标签: pythonpandasnumpydataframe

解决方案


我会采取以下方法:

遍历数据框的行如果主题百分比不为空:
如果主题百分比的总和不是 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

推荐阅读