Dataframe 数据帧与序列相乘
用Dataframe 数据帧与序列相乘,dataframe,pandas,multiplication,Dataframe,Pandas,Multiplication,用系列中存储的列向量乘以数据帧的所有列的最佳方法是什么?我曾经在Matlab中使用repmat()来实现这一点,这在Pandas中是不存在的。我可以使用np.tile() 谢谢。为什么不创建自己的数据框平铺功能: 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
系列中存储的列向量乘以数据帧的所有列的最佳方法是什么?我曾经在Matlab中使用repmat()
来实现这一点,这在Pandas中是不存在的。我可以使用np.tile()
谢谢。为什么不创建自己的数据框平铺功能:
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
例子:
然而,注意:“DataFrame无意成为ndarray的替代品,因为它的索引语义在某些地方与矩阵非常不同。”这大概应该被解释为“如果你在做大量矩阵工作,就使用numpy”
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
In[4]: func = lambda x: np.asarray(x) * np.asarray(ser)
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
现在我们有了数据帧
和系列
,我们需要一个传递到apply
的函数
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
In[4]: func = lambda x: np.asarray(x) * np.asarray(ser)
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
我们可以将此信息传递给df。应用
,我们就可以开始了
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
默认按列操作,但它也可以通过将axis=1
作为参数传递给apply
来按行操作
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
In[4]: func = lambda x: np.asarray(x) * np.asarray(ser)
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
通过在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
你怎么了
result = dataframe.mul(series, axis=0)
?
谢谢你的回答。但我需要的是按元素进行乘法。在matlab中,这可能是df.*repmat(s,1,2)。也许最好的办法是将data.frame转换成ndarray。@jianpan我明白了,我不明白/。。。我想建议你只使用numpy?@jianpan这个定制瓷砖功能怎么样?谢谢hayden。我在这里犹豫是否将df转换为ndarray,因为在元素相乘之后,我需要将数据返回到df进行其他计算。我想这可能是熊猫中存在的,因为按列缩放是金融应用程序中非常常见的操作。我只是不知道DataFrame.mul!更简单的方法。对我来说不管用。我得到:TypeError:不能将序列与“float”类型的非整数相乘。