规范化熊猫数据框的行

use*_*538 3 python pandas

我需要规范化包含全零填充的行的数据帧的行。例如:

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 
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

然后按如下方式连接两个数据帧:

pd.concat([df1, df2]).reset_index()
Run Code Online (Sandbox Code Playgroud)

但是,我在申请时遇到以下错误 df1.div(sum_row, axis=0)

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

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

编辑:预计生成的数据框如下所示:

ID  A     B
1   0.2   0.8 
2   0     0
3   0.25  0.75
4   0     0 
Run Code Online (Sandbox Code Playgroud)

Viv*_*mar 5

您可以在 scikit-learn 中使用Normalizer

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
Run Code Online (Sandbox Code Playgroud)


cos*_*iry 4

使用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)
Run Code Online (Sandbox Code Playgroud)