熊猫根据其最大值划分多列

时间:2018-08-27 20:00:21

标签: python pandas

我有一个包含40列的数据框,其中一些列是仅包含0或1的二进制列。我想用一个称为'size'的列来划分所有非二进制列

现在我正在使用:

for i in range(df.shape[1]):
    col = df.iloc[:, i]
    if int(col.max()) > 1: # to check whether this column is binary
        df.iloc[:, i] = col/df['size']
    i+=1

我觉得我们应该避免在熊猫中使用foor-loop,所以有没有更优雅的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

应该执行以下操作(假设数据框中至少有一个非二进制列):

cols = df.columns[np.where(df.max(axis=0)>1)[0]].tolist() # find all non-binary column names
cols.remove('size') # exclude the column 'size' from the list, assuming that size is a non-binary column as well
df.loc[:,cols] = df.loc[:,cols].div(df.size, axis=0) # divide all the non-binary columns by size
#df.head()

答案 1 :(得分:1)

此处不需要IMHO numpytolist,pandas可以完成此任务:

返回最大值大于1的所有列,并丢掉'size':

cols = df.columns[df.max()>1].drop('size')

为了进行计算,只选择了完整的列,没有子集,因此您可以保留“ ix”或“ loc”,并直接按列名进行索引:

df[cols] = df[cols].div(df['size'], 0)