У меня есть dataframe вроде этого:панды получить индекс высшей точки продукта
df1 = pd.DataFrame({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
a b c
0 1 5 9
1 2 6 10
2 3 7 11
3 4 8 12
И я хотел бы создать еще один столбец в этом dataframe, которая хранит для каждой строки, которые другая строка получает наибольшее количество очков, когда выполняется точечный продукт против.
Например для первой строки мы вычислим точечные продукты от других строк:
df1.drop(0).dot(df1.loc[0]).idxmax()
output: 3
Поэтому я могу создать функцию:
def get_highest(dataframe):
lis = []
for row in dataframe.index:
temp = dataframe.drop(row).dot(dataframe.loc[row])
lis.append(temp.idxmax())
return lis
И я получаю то, что я хочу с :
df1['highest'] = get_highest(df1)
output:
a b c highest
0 1 5 9 3
1 2 6 10 3
2 3 7 11 3
3 4 8 12 2
Хорошо, это работает, но проблема в том, что он не масштабируется на ВСЕ. Вот выходы timeit
для различного количества строк:
4 rows: 2.87 ms
40 rows: 77.1 ms
400 rows: 700 ms
4000 rows: 10.4s
И я должен выполнить это на dataframe, который имеет примерно 240k строк и столбцов 3.3K. Поэтому вот мой вопрос: есть ли способ оптимизировать этот расчет? (вероятно, обратившись к нему по-другому)
Заранее спасибо.
Я добавил Numpy тег, потому что, вероятно, NumPy решение на базе будет работать быстрее, так Numpy люди могут также иметь вид на него. – ayhan
@ayhan Хорошая идея, спасибо – ysearka
Это может быть полезно. http://stackoverflow.com/q/38177464/2336654 – piRSquared