我的df如下所示:
date 2017-10-07 2017-10-08
id
1 2017-09-07 46.0 5.0
2 2017-10-07 1.0 0.0
3 2017-11-07 123.0 0.0
4 2017-10-07 0.0 0.0
5 2017-10-08 0.0 0.0
并且希望能够从“日期”列中查找日期值,如果它与具有日期标题的列的列名匹配,则更改df中的特定值。
例如,在上面的df中,输出看起来像:
date 2017-10-07 2017-10-08
id
1 2017-09-07 46.0 5.0
2 2017-10-07 1.0 0.0
3 2017-11-07 123.0 0.0
4 2017-10-07 "CHANGED" 0.0
5 2017-10-08 0.0 "CHANGED"
我可以在每个列和行的for循环中执行此操作,但这很耗时,我知道必须有更好的方法。
提前致谢!
答案 0 :(得分:3)
您可以使用numpy广播,执行分配,然后重新分配结果。
v = df.values[:, 1:]
v[df.date.values[:, None] == df.columns[1:].values] = 'CHANGED'
df.iloc[:, 1:] = v
df
date 2017-10-07 2017-10-08
id
1 2017-09-07 46 5
2 2017-10-07 CHANGED 0
3 2017-11-07 123 0
4 2017-10-07 CHANGED 0
5 2017-10-08 0 CHANGED
答案 1 :(得分:1)
使用stack
和unstack
df1=df.reset_index().melt(['id','date'])
df1.loc[df1.date==df1.variable,'value']='changed'
df1.set_index(['id','variable','date']).unstack(-2)
Out[189]:
value
variable 2017-10-07 2017-10-08
id date
1 2017-09-07 46 5
2 2017-10-07 changed 0
3 2017-11-07 123 0
4 2017-10-07 changed 0
5 2017-10-08 0 changed