Python:将一个数据帧中的列与另一个数据帧中的列进行累加和分割
我有2个数据帧,如下所示。我需要一个结果数据,其中数据帧1的周期累计和除以python中数据帧2的周期累计和,在pin、site和department索引 数据帧1: 数据帧2: 输出 无论两个数据帧中管脚的顺序如何,我都需要如上所述的结果数据帧。周期数将逐月增加。我认为需要将索引按除法对齐,最后添加Python:将一个数据帧中的列与另一个数据帧中的列进行累加和分割,python,pandas,numpy,Python,Pandas,Numpy,我有2个数据帧,如下所示。我需要一个结果数据,其中数据帧1的周期累计和除以python中数据帧2的周期累计和,在pin、site和department索引 数据帧1: 数据帧2: 输出 无论两个数据帧中管脚的顺序如何,我都需要如上所述的结果数据帧。周期数将逐月增加。我认为需要将索引按除法对齐,最后添加多索引中的列: df11 = df1.set_index(['Pin','Site','Department']).cumsum(axis=1) df22 = df2.set_index(['Pin
多索引中的列:
df11 = df1.set_index(['Pin','Site','Department']).cumsum(axis=1)
df22 = df2.set_index(['Pin','Site','Department']).cumsum(axis=1)
df = df11.div(df22).reset_index()
print (df)
Pin Site Department Period1 Period2 Period3 Period4
0 1001 L 42 1.0 0.333333 0.428571 0.500000
1 1002 R 45 0.8 0.818182 0.687500 0.714286
2 1003 L 42 1.0 0.888889 0.733333 0.652174
编辑:
对于筛选出的值>1
需要反转条件-保留值是否保证数据帧中的Pin、Site和Department列相同?^如果是,则可以尝试使用df1.iloc[:,3::.cumsum(axis=1).div(df2.iloc[:,3:.cumsum(axis=1))
数据帧1和2的顺序可能会发生变化。但是每个pin都有唯一的站点和部门。如果订单发生变化,您应该如何将数据从一个映射到另一个?还有,你不认为这是你在问题中忽略提到的重要信息吗?如果有人决定做出这样的假设并回答你的问题,他们会浪费他们的时间和你的时间。请在您的问题中添加所有相关信息,谢谢。谢谢您指出。我已按建议更改了问题。@jezrael非常感谢!!代码运行得非常好@斯里坎特-不客气!如果我的答案有帮助,别忘了——点击答案旁边的复选标记,将其从灰色变为填充。谢谢。@jezrael完成了!!再一次,非常感谢@jezrael除了输出之外,我还想删除任何时段中值大于1的行。你能帮我解决这个问题吗?
Pin Site Department Period1 Period2 Period3 Period4
1002 R 45 5 6 5 5
1003 L 42 4 5 6 8
1001 L 42 1 2 4 5
Pin Site Department Period1 Period2 Period3 Period4
1001 L 42 1/1 (1+0)/(1+2) (1+0+2)/(1+2+4) (1+0+2+3)/(1+2+4+5)
1002 R 45 4/5 (4+5)/(5+6) (4+5+2)/(5+6+5) (4+5+2+4)/(5+6+5+5)
1003 L 42 4/4 (4+4)/(4+5) (4+4+3)/(4+5+6) (4+4+3+4)/(4+5+6+8)
df11 = df1.set_index(['Pin','Site','Department']).cumsum(axis=1)
df22 = df2.set_index(['Pin','Site','Department']).cumsum(axis=1)
df = df11.div(df22).reset_index()
print (df)
Pin Site Department Period1 Period2 Period3 Period4
0 1001 L 42 1.0 0.333333 0.428571 0.500000
1 1002 R 45 0.8 0.818182 0.687500 0.714286
2 1003 L 42 1.0 0.888889 0.733333 0.652174
df = df11.div(df22)
df = df[(df <= 1).all(axis=1)].reset_index()