2016-05-20 6 views
4

Я пытаюсь применить функцию к строкам DataFrame с аргументом apply args. Я вижу multiplesimilarquestions, но следующие решения, похоже, не сработают. Я создал пример.pandas применить функцию с аргументами no lambda

Здесь я разделю dataframe на сумму столбцов

pij=pd.DataFrame(np.random.randn(500,2)) 
pij.divide(pij.sum(1),axis=0).head() 
      0   1 
0 1.077353 -0.690463 
1 0.608302 0.583209 
2 -0.724272 -1.665318 
3 -0.735404 -0.606744 
4 -0.033409 -0.162695 

Я знаю, как использовать лямбда, чтобы вернуть тот же результат

def lambda_divide(row): 
    return row/row.sum(0) 
pij.apply(lambda row: lambda_divide(row), axis=1).head() 
      0   1 
0 1.077353 -0.690463 
1 0.608302 0.583209 
2 -0.724272 -1.665318 
3 -0.735404 -0.606744 
4 -0.033409 -0.162695 

Однако, когда я пытаюсь использовать применить аргументы , он не работает

pij.apply(np.divide,args=(pij.sum(1))) 

ответ

2

Полная ошибка предполагает, что это связано с специальным корпусом pandas u funcs:

4045 
    4046   if isinstance(f, np.ufunc): 
-> 4047    results = f(self.values) 
    4048    return self._constructor(data=results, index=self.index, 
    4049          columns=self.columns, copy=False) 

ValueError: invalid number of arguments 

Это похоже на ошибку!


В данном конкретном случае вы можете использовать DIV:

In [11]: df.div(df.sum(1), axis=0) 
Out[11]: 
      0   1 
0 2.784649 -1.784649 
1 0.510530 0.489470 
2 0.303095 0.696905 
3 0.547931 0.452069 
4 0.170364 0.829636 
Смежные вопросы