标准化熊猫数据框的行

时间:2018-08-24 15:01:14

标签: python pandas

我需要规范化数据框的行,其中包含全为零的行。例如:

Y

我的方法是先排除零值行,然后使用以下方法归一化非零子集:

df= pd.DataFrame({"ID": ['1', '2', '3', '4'], "A": [1, 0, 10, 0], "B": [4, 0, 30, 0]})

ID  A   B
1   1   4
2   0   0
3   10  30
4   0   0 

,然后按如下所示连接两个数据框:

df1 = df[df.sum(axis=1) != 0]
df2 = df[df.sum(axis=1) == 0]
sum_row = df1.sum(axis=1)
df1.div(sum_row, axis=0)

但是,在应用pd.concat([df1, df2]).reset_index()

时出现以下错误
  

ValueError:操作数不能与形状(6,)一起广播   (2,)

我想知道如何解决该错误以及是否存在更有效的方法。谢谢!

编辑:生成的数据框预期如下:

df1.div(sum_row, axis=0)

3 个答案:

答案 0 :(得分:2)

使用div

df= pd.DataFrame({"ID": ['1', '2', '3', '4'], "A": [1, 0, 10, 0], "B": [4, 0, 30, 0]})
df.set_index("ID", inplace=True)
df.div(df.sum(axis=1), axis=0).fillna(0)

答案 1 :(得分:1)

您可以使用Normalizer in scikit-learn

df= pd.DataFrame({"ID": ['1', '2', '3', '4'], "A": [1, 0, 10, 0], "B": [4, 0, 30, 0]})
df = df.set_index('ID')

from sklearn.preprocessing import Normalizer
df.iloc[:,:] = Normalizer(norm='l1').fit_transform(df)

print(df)

       A     B
ID            
1   0.20  0.80
2   0.00  0.00
3   0.25  0.75
4   0.00  0.00

答案 2 :(得分:1)

meltcrosstab一起使用

newdf=df.melt('ID')
pd.crosstab(index=newdf.ID,columns=newdf.variable,values=newdf.value,normalize='index',aggfunc='mean')
Out[447]: 
variable     A     B
ID                  
1         0.20  0.80
2         0.00  0.00
3         0.25  0.75
4         0.00  0.00