2013-04-02 25 views
7

Nie mogę znaleźć wpisu w metodzie dot()in the official documentation. Jednak metoda istnieje i mogę z niej korzystać. Dlaczego to?Uzyskiwanie iloczynu punktowego dla ramki danych z wektorem i ramki danych zwrotnej w Pandas

Na ten temat, czy istnieje sposób obliczenia mnożenia elementarnego każdego wiersza w ramce danych z innym wektorem? (i uzyskasz dataframe z powrotem?), to jest podobną do dot(), ale zamiast obliczać produkt w postaci kropki, oblicza się produkt elementarny.

+0

Możesz opublikować to jako [problem na github] (https://github.com/pydata/pandas/issues). Jeśli wyewidencjonujesz docstring na kropce, powie ci, co robi (jeśli używasz ipython, użyj 'df.dot?'). –

Odpowiedz

8

Oto przykład, w jaki sposób pomnożyć DataFrame przez wektor:

In [60]: df = pd.DataFrame({'A': [1., 1., 1., 2., 2., 2.], 'B': np.arange(1., 7.)}) 

In [61]: vector = np.array([2,2,2,3,3,3]) 

In [62]: df.mul(vector, axis=0) 
Out[62]: 
    A B 
0 2 2 
1 2 4 
2 2 6 
3 6 12 
4 6 15 
5 6 18 
+0

Dzięki !. Czy wiesz, dlaczego 'dot()' nie jest częścią oficjalnego dokumentu? –

+2

Istnieją dwie metody "kropki" w Pandach. 'Serial.dot' jest dziedziczony z' ndarray.dot', ponieważ 'Seria' jest podklasą' ndarray' NumPy. Możesz znaleźć dokumentację dla tego [tutaj] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html). Co do 'DataFrame.dot', domyślam się, że po prostu nie udało im się tego udokumentować. (Zachowanie to jest całkiem zrozumiałe, gdy przegląda się jego definicję w 'pandas/core/frame.py'). – unutbu

+1

Aktualizacja:' pandas.Series' nie jest już podklasą 'ndarray', ale nadal ma kropkę [ 'method] (http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.Series.dot.html). – unutbu

1

Trudno powiedzieć z pewną dokładnością.

Często istnieje metoda, która jest nieudokumentowana, ponieważ jest uznawana za wewnętrzną przez sprzedawcę i może podlegać zmianom.

Może to być oczywiste niedopatrzenie osób, które sporządziły dokumentację.

Odnośnie drugiego pytania; Naprawdę nie wiem o tym - ale może lepiej byłoby napisać dla niego nowe pytanie na temat S/O. Po prostu skanowanie interfejsu API, czy możesz coś zrobić za pomocą funkcji .applymap (funkcja) DataFrame?

6

Mnożenie robi w istocie zewnętrzną produkt uboczny. Kropka jest produktem wewnętrznym, jeśli moja pamięć algebry liniowej jest poprawna. Pozwól mi rozwinąć zaakceptowanej odpowiedzi:

In [13]: df = pd.DataFrame({'A': [1., 1., 1., 2., 2., 2.], 'B': np.arange(1., 7.)}) 

In [14]: v1 = np.array([2,2,2,3,3,3]) 

In [15]: v2 = np.array([2,3]) 

In [16]: df.shape 
Out[16]: (6, 2) 

In [17]: v1.shape 
Out[17]: (6,) 

In [18]: v2.shape 
Out[18]: (2,) 

In [24]: df.mul(v2) 
Out[24]: 
    A B 
0 2 3 
1 2 6 
2 2 9 
3 4 12 
4 4 15 
5 4 18 

In [26]: df.dot(v2) 
Out[26]: 
0  5 
1  8 
2 11 
3 16 
4 19 
5 22 
dtype: float64 

Więc:

df.mul bierze matrycę kształtu (6,2) i wektora (6, 1) i zwraca kształt Matrix (6,2)

Podczas:

df.dot przyjmuje matrycę kształtu (6,2) i wektor (2,1) oraz zwraca (6,1).

To nie są te same operacje, są one (jak sądzę) odpowiednio produktami zewnętrznymi i wewnętrznymi.

+1

Dzięki, znalazłem tę najbardziej pomocną odpowiedź tutaj. Lepiej też niż doktor pandy. – smci