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列,如果要键入其中的每一列,那将是非常疯狂的。但是,谢谢你的尝试。我很感激