Python 根据行的分组修改数据框,并根据条件更新列
我有一个dataframe,我需要基于少数列中相同的行值应用条件,并更新其他列 输入数据帧代码: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.
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
我尝试过很多东西,比如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
,您如何知道要减去哪一行?您应该使用该示例和预期输出更新您的问题。您还可以创建一个新问题…谢谢,让我创建一个新问题。