我有一个数据框,其中的一列为“ 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的初学者,我可以找到效率低下的蛮力解决方案,但是我知道必须有一种更简单的方法来做到这一点。谁能帮助新手?
答案 0 :(得分:1)
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