pandas dataframe multiplicar con una serie
multiplying (3)
¿Por qué no creas tu propia función de mosaico de marco de datos?
def tile_df(df, n, m):
dfn = df.T
for _ in range(1, m):
dfn = dfn.append(df.T, ignore_index=True)
dfm = dfn.T
for _ in range(1, n):
dfm = dfm.append(dfn.T, ignore_index=True)
return dfm
Ejemplo:
df = pandas.DataFrame([[1,2],[3,4]])
tile_df(df, 2, 3)
# 0 1 2 3 4 5
# 0 1 2 1 2 1 2
# 1 3 4 3 4 3 4
# 2 1 2 1 2 1 2
# 3 3 4 3 4 3 4
Sin embargo , la nota de los docs : "DataFrame no pretende ser un reemplazo directo para ndarray ya que su semántica de indexación es bastante diferente en lugares de una matriz". Lo que presumiblemente debe interpretarse como "usar numpy si haces muchas cosas de matriz" .
¿Cuál es la mejor manera de multiplicar todas las columnas de un DataFrame
Pandas por un vector de columna almacenado en una Series
? Solía hacer esto en Matlab con repmat()
, que no existe en Pandas. Puedo usar np.tile()
, pero parece feo convertir la estructura de datos hacia adelante y hacia atrás cada vez.
Gracias.
Esto puede lograrse simplemente con el método DataFrame.
In[1]: import pandas as pd; import numpy as np
In[2]: df = pd.DataFrame(np.arange(40.).reshape((8, 5)), columns=list(''abcde'')); df
Out[2]:
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
5 25 26 27 28 29
6 30 31 32 33 34
7 35 36 37 38 39
In[3]: ser = pd.Series(np.arange(8) * 10); ser
Out[3]:
0 0
1 10
2 20
3 30
4 40
5 50
6 60
7 70
Ahora que tenemos nuestro DataFrame
y Series
, necesitamos una función para aprobar.
In[4]: func = lambda x: np.asarray(x) * np.asarray(ser)
Podemos pasar esto a df.apply
y estamos df.apply
para ir
In[5]: df.apply(func)
Out[5]:
a b c d e
0 0 0 0 0 0
1 50 60 70 80 90
2 200 220 240 260 280
3 450 480 510 540 570
4 800 840 880 920 960
5 1250 1300 1350 1400 1450
6 1800 1860 1920 1980 2040
7 2450 2520 2590 2660 2730
df.apply
actúa en forma de columnas por defecto, pero también puede actuar en filas al pasar axis=1
como argumento para apply
.
In[6]: ser2 = pd.Series(np.arange(5) *5); ser2
Out[6]:
0 0
1 5
2 10
3 15
4 20
In[7]: func2 = lambda x: np.asarray(x) * np.asarray(ser2)
In[8]: df.apply(func2, axis=1)
Out[8]:
a b c d e
0 0 5 20 45 80
1 0 30 70 120 180
2 0 55 120 195 280
3 0 80 170 270 380
4 0 105 220 345 480
5 0 130 270 420 580
6 0 155 320 495 680
7 0 180 370 570 780
Esto podría hacerse de manera más concisa definiendo la función anónima dentro de apply
In[9]: df.apply(lambda x: np.asarray(x) * np.asarray(ser))
Out[9]:
a b c d e
0 0 0 0 0 0
1 50 60 70 80 90
2 200 220 240 260 280
3 450 480 510 540 570
4 800 840 880 920 960
5 1250 1300 1350 1400 1450
6 1800 1860 1920 1980 2040
7 2450 2520 2590 2660 2730
In[10]: df.apply(lambda x: np.asarray(x) * np.asarray(ser2), axis=1)
Out[10]:
a b c d e
0 0 5 20 45 80
1 0 30 70 120 180
2 0 55 120 195 280
3 0 80 170 270 380
4 0 105 220 345 480
5 0 130 270 420 580
6 0 155 320 495 680
7 0 180 370 570 780
Qué hay de malo en
result = dataframe.mul(series, axis=0)
?
http://pandas.pydata.org/pandas-docs/stable/basics.html#flexible-binary-operations