Другие вопросы, пытающиеся предоставить функцию python
, эквивалентную R
* sweep
(например, здесь ), на самом деле не касаются случая множественных аргументов, где это наиболее полезно.
Скажем, я хочу применить функцию 2 аргументов к каждой строке Dataframe с соответствующим элементом из столбца другого DataFrame:
df = data.frame("A" = 1:3,"B" = 11:13)
df2= data.frame("X" = 10:12,"Y" = 10000:10002)
sweep(df,1, FUN="*",df2$X)
В python
Я получил эквивалент, используяapply
на то, что в основном представляет собой цикл по ряду строк.
df = pd.DataFrame( { "A" : range(1,4),"B" : range(11,14) } )
df2 = pd.DataFrame( { "X" : range(10,13),"Y" : range(10000,10003) } )
pd.Series(range(df.shape[0])).apply(lambda row_count: np.multiply(df.iloc[row_count,:],df2.iloc[row_count,df2.columns.get_loc('X')]))
Я очень сомневаюсь, что это эффективно в pandas
, как лучше это сделать?
При применении *
:
A B
1 10 110
2 22 132
3 36 156
оба бита кода должны приводить к кадру данных / матрице из 6 чисел. Я должен четко заявить, что цель состоит в том, чтобы вставить в него свою собственную функциюsweep
подобное поведение говорит:
df = data.frame("A" = 1:3,"B" = 11:13)
df2= data.frame("X" = 10:12,"Y" = 10000:10002)
myFunc = function(a,b) { floor((a + b)^min(a/2,b/3)) }
sweep(df,1, FUN=myFunc,df2$X)
, что приводит к:
A B
[1,] 3 4
[2,] 3 4
[3,] 3 5
Каков хороший способ сделать это в пандах Python?