Python 根据行的分组修改数据框,并根据条件更新列

Python 根据行的分组修改数据框,并根据条件更新列,python,pandas,Python,Pandas,我有一个dataframe,我需要基于少数列中相同的行值应用条件,并更新其他列 输入数据帧代码: df = DataFrame({ 'exp':['1y','1y','1y','1y','1y','1y'], 'mat':['1y','1y','1y','2y','2y','2y'], 'reg':['in', 'in', 'in', 'in', 'in', 'in'], 'con':['w','s','c','w','s','c'], 'val':[2.

我有一个dataframe,我需要基于少数列中相同的行值应用条件,并更新其他列

输入数据帧代码:

df = DataFrame({
    'exp':['1y','1y','1y','1y','1y','1y'],
    'mat':['1y','1y','1y','2y','2y','2y'],
    'reg':['in', 'in', 'in', 'in', 'in', 'in'],
    'con':['w','s','c','w','s','c'],
    'val':[2.5,0,-2.5,2.5,0,-2.5],
    'rs':[6, 10, 4, 12, 30, 6 ]
})
df
输入数据帧:

    exp mat reg con val  rs
0   1y  1y  in  w   2.5   6
1   1y  1y  in  s   0.0  10
2   1y  1y  in  c   -2.5  4
3   1y  2y  in  w   2.5  12
4   1y  2y  in  s   0.0  30
5   1y  2y  in  c   -2.5. 6
    exp mat reg con val  rs
0   1y  1y  in  w   2.5  5
1   1y  1y  in  s   0.0  10
2   1y  1y  in  c   -2.5 1
3   1y  2y  in  w   2.5  9
4   1y  2y  in  s   0.0  30
5   1y  2y  in  c   -2.5 3
预期输出数据帧:

    exp mat reg con val  rs
0   1y  1y  in  w   2.5   6
1   1y  1y  in  s   0.0  10
2   1y  1y  in  c   -2.5  4
3   1y  2y  in  w   2.5  12
4   1y  2y  in  s   0.0  30
5   1y  2y  in  c   -2.5. 6
    exp mat reg con val  rs
0   1y  1y  in  w   2.5  5
1   1y  1y  in  s   0.0  10
2   1y  1y  in  c   -2.5 1
3   1y  2y  in  w   2.5  9
4   1y  2y  in  s   0.0  30
5   1y  2y  in  c   -2.5 3
多个条件基于行和列:

  • 对于列的行中的相同值
    类似于exp=1y、mat=1y、reg=in的所有3行

    a。根据列“con”更新列“rs”

      if 'con' == w, then rs = (current_rs + rs(con == c)) / 2  i.e (6+4)/2 
      if 'con' == s, then no changes
      if 'con' == c, then rs = (rs(con == w) - current_rs)) / 2 i.e (6-4)/2
    
  • 从3行中应用相同的条件,其中exp=1y,mat=2y,reg=in

  • 我的数据集相当大,有许多其他区域和更多“exp”、“mat”和“reg”列的组合。
    我尝试过很多东西,比如groupby、iloc、np.where、filter,但都没有成功

    不成功的尝试:

    df.groupby(['exp','mat','reg']) # not sure what can be the next condition
    

    您可以取消堆叠数据,使
    con
    成为列,然后您可以轻松地修改数据:

    tmp = df.set_index(['exp','mat','reg','con']).unstack()
    tmp[('rs','w')],tmp[('rs','c')] = ((tmp[('rs','w')] + tmp[('rs','c')])/2,
                                       (tmp[('rs','w')] - tmp[('rs','c')])/2)
    tmp.stack().reset_index()
    
    输出:

      exp mat reg con    val    rs
    0  1y  1y  in   c   -2.5   1.0
    1  1y  1y  in   s    0.0  10.0
    2  1y  1y  in   w    2.5   5.0
    3  1y  2y  in   c   -2.5   3.0
    4  1y  2y  in   s    0.0  30.0
    5  1y  2y  in   w    2.5   9.0
    

    您不应该从帖子中删除您的尝试…我只是删除了缩短问题的尝试,修改了问题以使其更清晰。嘿,我正要复制您的数据帧初始化:-(许多人希望看到真正的尝试,在某些情况下,这可能是一些你忽略的简单事情。另外,你在那里发布的内容并没有那么长。广黄-我正在解决一个类似的问题,几乎类似的df,但有更多的列,我还必须对rs列进行加法和减法运算,但我得到了“值错误:Inde”x包含重复的条目,无法重塑。只是想知道我是否可以通过一些解决方法将其取消堆叠,或者我是否必须选择其他选项,如pivot、pivot\u table等。当出现
    重复条目
    错误时,意味着在某个地方有多行组合相同的
    (exp、mat、reg、con)
    pivot
    将失败,因为它相当于
    unstack()
    pivot\u表将平均它们。在这种情况下,您想做什么?我需要在“rs”列中应用相同的逻辑:tmp[('rs','w')],tmp[('rs','c')=((tmp[('rs','w')])+tmp[('rs','c'))/2,(tmp[('rs','w')]-tmp[('rs','c'))/2)(问题完全相同,但现在数据是这样的,我得到了“值错误”:在运行set_index()之后)如果有很多行都是相同的,例如c中的
    1y 1y
    ,您如何知道要减去哪一行?您应该使用该示例和预期输出更新您的问题。您还可以创建一个新问题…谢谢,让我创建一个新问题。