pandas根据另一列

时间:2017-12-17 20:06:10

标签: python pandas

我的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循环中执行此操作,但这很耗时,我知道必须有更好的方法。

提前致谢!

2 个答案:

答案 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)

使用stackunstack

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