【问题标题】:Modify dataframe based on grouping of rows and update columns based on conditions根据行分组修改数据框并根据条件更新列
【发布时间】:2021-03-23 15:10:26
【问题描述】:

我有一个数据框,我需要根据几列中行的相同值应用条件并更新其他列。

输入数据帧代码:

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

多个条件基于行和列:

  1. 对于列中的相同值
    就像 exp=1y, mat=1y, reg=in 的所有 3 行一样。

    一个。根据 col '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
    
  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

【问题讨论】:

  • 您不应该从帖子中删除您的尝试...
  • 我刚刚删除了使问题更短的尝试,同时修改了问题以使其更清晰。
  • 嘿,我正要复制你的数据框初始化。 :-(
  • 很多人都希望看到真正的尝试,在某些情况下,这可能是您忽略了一些简单的事情。另外,您在那里发布的内容并不长。

标签: python pandas


【解决方案1】:

您可以取消堆叠数据,使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

【讨论】:

  • Quang Hoang - 我正在用几乎相似的 df 解决一个类似的问题,但有更多的列,我还必须在 rs 列上进行加法和减法,但我得到“值错误:索引包含重复条目,无法重塑'。只是想提出一个建议,如果我可以通过一些解决方法将其解开,或者我是否必须选择其他选项,例如 pivot、pivot_table 等。
  • 当您出现duplicate entries 错误时,这意味着在某处您有几行具有相同的组合(exp, mat, reg, con)pivot 将失败,因为它等同于 unstack()pivot_table 将平均它们。在这种情况下你想做什么?
  • 我需要在 'rs' 列中应用相同的逻辑: tmp[('rs','w')],tmp[('rs','c')] = ((tmp [('rs','w')] + tmp[('rs','c')])/2, (tmp[('rs','w')] - tmp[('rs',' c')])/2) (问题完全相同,但现在数据是这样的,我得到“值错误”:运行 set_index() 后)
  • 发生的情况是你有很多行相同,例如1y 1y in c,你怎么知道选择减去哪一个?您应该使用该示例和预期输出更新您的问题。您还可以创建一个新问题...
  • 谢谢,让我创建一个新问题。
猜你喜欢
  • 2023-02-02
  • 2021-11-25
  • 2017-11-13
  • 2023-02-20
  • 2018-11-29
  • 2020-06-25
  • 1970-01-01
  • 2023-02-21
  • 2023-03-24
相关资源
最近更新 更多