문제는 다른 크기의 프레임이있는 프레임에 다른 행 인덱스를 곱한 것입니다.
In [121]: df = DataFrame([[1,2.2,3.5],[6.1,0.4,1.2]], columns=list('abc'))
In [122]: weight = DataFrame(Series([0.5, 0.3, 0.2], index=list('abc'), name=0))
In [123]: df
Out[123]:
a b c
0 1.00 2.20 3.50
1 6.10 0.40 1.20
In [124]: weight
Out[124]:
0
a 0.50
b 0.30
c 0.20
In [125]: df * weight
Out[125]:
0 a b c
0 nan nan nan nan
1 nan nan nan nan
a nan nan nan nan
b nan nan nan nan
c nan nan nan nan
당신은 칼럼에 액세스 할 수 있습니다 :
In [126]: df * weight[0]
Out[126]:
a b c
0 0.50 0.66 0.70
1 3.05 0.12 0.24
In [128]: (df * weight[0]).sum(1)
Out[128]:
0 1.86
1 3.41
dtype: float64
을 또는 다른 DataFrame
In [127]: df.dot(weight)
Out[127]:
0
0 1.86
1 3.41
모두 함께 가져 오려면 다시 얻을 dot
를 사용
In [130]: df['weighted_sum'] = df.dot(weight)
In [131]: df
Out[131]:
a b c weighted_sum
0 1.00 2.20 3.50 1.86
1 6.10 0.40 1.20 3.41
여기에 솔루션입니다
다음은 각 방법의 timeit
입니다. 큰 숫자는 DataFrame
입니다. 넓은 DataFrame
를 들어
In [145]: df = DataFrame(randn(10000000, 3), columns=list('abc'))
weight
In [146]: weight = DataFrame(Series([0.5, 0.3, 0.2], index=list('abc'), name=0))
In [147]: timeit df.dot(weight)
10 loops, best of 3: 57.5 ms per loop
In [148]: timeit (df * weight[0]).sum(1)
10 loops, best of 3: 125 ms per loop
:
In [162]: df = DataFrame(randn(10000, 1000))
In [163]: weight = DataFrame(randn(1000, 1))
In [164]: timeit df.dot(weight)
100 loops, best of 3: 5.14 ms per loop
In [165]: timeit (df * weight[0]).sum(1)
10 loops, best of 3: 41.8 ms per loop
그래서, dot
보다 빠르고 읽을 수 있습니다.
참고 : 데이터 중 NaN
의를 포함 할 경우는 당신은 곱셈 - 및 - 합계 방법을 사용한다 dot
을 사용할 수 없습니다. dot
은 numpy.dot()
(약 NaN
을 처리하지 않음) 주위의 단순한 래퍼이므로 NaN
을 처리 할 수 없습니다.
'DataFrame'과 '가중치'중 일부를 표시 할 수 있습니까? 왜 이렇게하는 데 문제가 있는지 명확하지 않습니다. 'weights'를 가지고 행 값의 내적을 원한다면'ndarray.dot' 메쏘드'row.values.dot (weights.values)'를 사용하십시오. –