根据另一列中的条件填充多个数据框列

时间:2018-10-12 08:58:01

标签: python python-3.x pandas

我有一个数据框,其中的一列为“ id”,一周的每一天为一列。

我正在尝试使用“ id”列上的条件填充“天”列。

例如,

if df['id'] == 1:
    df['monday'] = 1

这很简单,但是在一种情况下,我需要同时填写多列,即出现问题:

multiple_days = ['m', 't', 'w', 'T', 'f']

if df['id'] == 3:

for day in multiple_days:
    df[day] = 1

我显然是Python的初学者,我可以找到效率低下的蛮力解决方案,但是我知道必须有一种更简单的方法来做到这一点。谁能帮助新手?

1 个答案:

答案 0 :(得分:1)

使用DataFrame.mask

df = pd.DataFrame({
        'id':[1,2,1,2,1,1],
         'm':[4,5,4,5,5,4],
         't':[7,8,9,4,2,3],
         'w':[1,3,5,7,1,0],
         'T':[5,3,6,9,2,4],
         'f':[1,3,5,7,1,0],
})

multiple_days = ['m', 't', 'w', 'T', 'f']

m = df['id'] == 1
df[multiple_days] = df[multiple_days].mask(m, 1, axis=1)
print (df)
   id  m  t  w  T  f
0   1  1  1  1  1  1
1   2  5  8  3  3  3
2   1  1  1  1  1  1
3   2  5  4  7  9  7
4   1  1  1  1  1  1
5   1  1  1  1  1  1

来自comments的@Pankaj Joshi的另一个想法:

df.loc[m, multiple_days] = 1

或者用numpy.where进行广播的numpy解决方案:

arr = df[multiple_days].values
df[multiple_days] = np.where(m[:, None], 1, arr)
print (df)
   id  m  t  w  T  f
0   1  1  1  1  1  1
1   2  5  8  3  3  3
2   1  1  1  1  1  1
3   2  5  4  7  9  7
4   1  1  1  1  1  1
5   1  1  1  1  1  1
相关问题