Нормализация строк панд данных - PullRequest
0 голосов
/ 24 августа 2018

Мне нужно нормализовать строки кадра данных, содержащие строки, заполненные всем нулем.Например:

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()

Однако я получаю следующую ошибку при применении 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 

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Использование melt с crosstab

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
0 голосов
/ 24 августа 2018

Использование 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)
0 голосов
/ 24 августа 2018

Вы можете использовать Нормализатор в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...