Python 如何将两个不同数据帧中相同位置的列相乘?

Python 如何将两个不同数据帧中相同位置的列相乘?,python,pandas,Python,Pandas,我试图从数据帧中删除多个列,以便相同的类型出现在数据帧的相同位置。例如,在下面的数据帧中,df1column和df2列本质上是相同的,并且顺序相同。唯一的区别是df2列有后缀,数据类型为float。列位置很重要,因为df1的第一列是df2的第一列的二分法。出于某种目的,我需要将每列的df2值乘以df1的二分法值,然后按行求和。这应该会生成一列,其中包含我需要用于其他内容的总和 第一个数据帧: df1 = {'a': {0: 0, 1: 0, 2: 0, 3: 0, 4: 1},

我试图从数据帧中删除多个列,以便相同的类型出现在数据帧的相同位置。例如,在下面的数据帧中,
df1
column和
df2
列本质上是相同的,并且顺序相同。唯一的区别是
df2
列有后缀,数据类型为float。列位置很重要,因为df1的第一列是df2的第一列的二分法。出于某种目的,我需要将每列的df2值乘以df1的二分法值,然后按行求和。这应该会生成一列,其中包含我需要用于其他内容的总和

第一个数据帧:

df1 = {'a': {0: 0,
  1: 0,
  2: 0,
  3: 0,
  4: 1},
 'b': {0: 1, 1: 0, 2: 1, 3: 0, 4: 0},
 'c': {0: 0, 1: 0, 2: 0, 3: 0, 4: 1},
 'd': {0: 0, 1: 1, 2: 1, 3: 0, 4: 0},
 'e': {0: 0, 1: 1, 2: 0, 3: 1, 4: 0},
 'f': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'g': {0: 0,
  1: 0,
  2: 0,
  3: 0,
  4: 0},
 'h': {0: 1,
  1: 0,
  2: 1,
  3: 1,
  4: 0},
 'i: {0: 0,
  1: 1,
  2: 0,
  3: 1,
  4: 0},
 'j': {0: 1, 1: 0, 2: 0, 3: 0, 4: 1}}
第二个数据帧

df2 = {'a_top3': {0: 0.084973365,
  1: 0.057013709,
  2: 0.072325557,
  3: 0.098824218,
  4: 0.252425998},
 'b_top3': {0: 0.168823063,
  1: 0.044829924,
  2: 0.178180799,
  3: 0.032501712,
  4: 0.054869764},
 'c_top3': {0: 0.040331405,
  1: 0.042758454,
  2: 0.077851109,
  3: 0.111247674,
  4: 0.160724968},
 'd_top3': {0: 0.11076121,
  1: 0.156901404,
  2: 0.111759722,
  3: 0.031440482,
  4: 0.046660293},
 'e_top3': {0: 0.059534989,
  1: 0.090733215,
  2: 0.087737411,
  3: 0.141953781,
  4: 0.011520214},
 'f_top3': {0: 0.067696713,
  1: 0.081674345,
  2: 0.034215827,
  3: 0.075849444,
  4: 0.011245198},
 'g_top3': {0: 0.041895844,
  1: 0.048191357,
  2: 0.102012217,
  3: 0.100579783,
  4: 0.034403443},
 'h_top3': {0: 0.124932915,
  1: 0.085968919,
  2: 0.220041335,
  3: 0.155145347,
  4: 0.032171372},
 'i_top3': {0: 0.103714436,
  1: 0.349804282,
  2: 0.077229746,
  3: 0.150859997,
  4: 0.081321001},
 'j_top3': {0: 0.197336018,
  1: 0.042124409,
  2: 0.038646296,
  3: 0.101597518,
  4: 0.314657748}}
我需要一个列,使它是位于相同位置的每列的乘积之和。比如说,

prod_sum = df1[['a','b','c']].mul(df2[['a_top3', 'b_top3', 'c_top3']], axis=0).sum(axis=1)
应提供以下资料:


我尝试的方法如上图所示,但我得到的只是
NaN
。我可以使用循环来实现这一点,但我想知道是否有一种
pythonic
方法来实现这一点?

首先使用
merge()
方法:

result=df1[['a','b','c']].merge(df2[['a_top3', 'b_top3', 'c_top3']],left_index=True,right_index=True)
最后使用
apply()
方法和
匿名函数

result=result.apply(lambda x:x['a']*x['a_top3']+x['b']*x['b_top3']+x['c']*x['c_top3'],axis=1)
现在,如果您打印
结果
,您将获得:

0    0.168823
1    0.000000
2    0.178181
3    0.000000
4    0.413151
dtype: float64

由于序列包含
float
类型数据,因此无法用
0
代替
0.000000

首先使用
merge()
方法:

result=df1[['a','b','c']].merge(df2[['a_top3', 'b_top3', 'c_top3']],left_index=True,right_index=True)
最后使用
apply()
方法和
匿名函数

result=result.apply(lambda x:x['a']*x['a_top3']+x['b']*x['b_top3']+x['c']*x['c_top3'],axis=1)
现在,如果您打印
结果
,您将获得:

0    0.168823
1    0.000000
2    0.178181
3    0.000000
4    0.413151
dtype: float64

由于序列包含
float
类型数据,因此无法用
0
代替
0.000000

获取数据的子集(df1和df2的前三列):

相乘(或任何类似操作)时,Pandas将尝试对齐索引和列。在这种情况下,我们需要找到一种方法将列名从
temp1
(a、b、c)对齐到
temp2
(a_top3,…)。在这种情况下,最简单的解决方案是删除
temp2
top3
后缀,然后Pandas将成功地将列相乘并返回所需的内容:

In [367]: temp1.mul(temp2.rename(columns = lambda x: x[0])).sum(1)
Out[367]: 
0    0.168823
1    0.000000
2    0.178181
3    0.000000
4    0.413151
dtype: float64
将相同的思想扩展到
df1
df2

In [368]: df1.mul(df2.rename(columns = lambda x: x[0])).sum(1)
Out[368]: 
0    0.491092
1    0.597439
2    0.509982
3    0.447959
4    0.727809
dtype: float64

让我们获取数据的一个子集(df1和df2的前三列):

相乘(或任何类似操作)时,Pandas将尝试对齐索引和列。在这种情况下,我们需要找到一种方法将列名从
temp1
(a、b、c)对齐到
temp2
(a_top3,…)。在这种情况下,最简单的解决方案是删除
temp2
top3
后缀,然后Pandas将成功地将列相乘并返回所需的内容:

In [367]: temp1.mul(temp2.rename(columns = lambda x: x[0])).sum(1)
Out[367]: 
0    0.168823
1    0.000000
2    0.178181
3    0.000000
4    0.413151
dtype: float64
将相同的思想扩展到
df1
df2

In [368]: df1.mul(df2.rename(columns = lambda x: x[0])).sum(1)
Out[368]: 
0    0.491092
1    0.597439
2    0.509982
3    0.447959
4    0.727809
dtype: float64

这正是我试图做的,通过删除列中的“字符”使其保持不变,但却不知道该做什么。我也试过
np.where()
,但也遇到了问题。所以,谢谢你给我指路。这正是我试图做的,我把“字符”从列中删除,使之保持不变,但我不知道该怎么做。我也试过
np.where()
,但也遇到了问题。所以,谢谢你带路。谢谢你回答这个问题。我遇到的唯一问题是,它要求我键入每个单独的列名。在我的实际数据集中,我有大约87列,如果要键入其中的每一列,那将是非常疯狂的。但是,谢谢你的尝试。谢谢你回答这个问题。我遇到的唯一问题是,它要求我键入每个单独的列名。在我的实际数据集中,我有大约87列,如果要键入其中的每一列,那将是非常疯狂的。但是,谢谢你的尝试。我很感激