我有一个包含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,所以有没有更优雅的方法来实现这一目标?
答案 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 numpy
和tolist
,pandas可以完成此任务:
返回最大值大于1的所有列,并丢掉'size':
cols = df.columns[df.max()>1].drop('size')
为了进行计算,只选择了完整的列,没有子集,因此您可以保留“ ix”或“ loc”,并直接按列名进行索引:
df[cols] = df[cols].div(df['size'], 0)