我正在努力寻找一些似乎微不足道的东西,但显然不是.一般情况:数据 – pandas数据帧 – 包含(以及其他)TOTAL_VISITS和NUM_PRINTS列.
目标:给定num_prints参数,找到NUM_prints = num_prints的行,并用给定的数字填充nans.
我停在哪里,它再也没有意义了:
indices= data['NUM_PRINTS'] == num_prints
data.loc[indices,'TOTAL_VISITS'].fillna(5,inplace=True)
这应该和我所知道的一样有效.没有在实践中填写任何东西,似乎它与副本或其他东西一起工作,因为它没有改变原始对象中的任何东西.
什么有效:
data.loc[indices,'TOTAL_VISITS'] = 2
这确实在num_print条件下用2填充列,但不考虑nans.
data['TOTAL_VISITS'].fillna(0, inplace=True)
这确实填写了总访问次数为0,但不考虑num_prints条件.
作为一个常规for循环使用.iloc,我有点无望,条件比我能处理的时间太长.
最佳答案 我认为需要在两侧进行过滤并仅对过滤行应用fillna:
np.random.seed(1213)
c = ['TOTAL_VISITS', 'A', 'NUM_PRINTS']
data = pd.DataFrame(np.random.choice([1,np.nan,3,4], size=(10,3)), columns=c)
print (data)
TOTAL_VISITS A NUM_PRINTS
0 1.0 4.0 4.0
1 NaN 3.0 1.0
2 1.0 1.0 1.0
3 4.0 3.0 3.0
4 1.0 3.0 4.0
5 4.0 4.0 3.0
6 4.0 1.0 4.0
7 NaN 4.0 3.0
8 NaN NaN 3.0
9 3.0 NaN 1.0
num_prints = 1
indices= data['NUM_PRINTS'] == num_prints
data.loc[indices,'TOTAL_VISITS'] = data.loc[indices,'TOTAL_VISITS'].fillna(100)
#alternative
#data.loc[indices,'TOTAL_VISITS'] = data['TOTAL_VISITS'].fillna(100)
print (data)
TOTAL_VISITS A NUM_PRINTS
0 1.0 4.0 4.0
1 100.0 3.0 1.0
2 1.0 1.0 1.0
3 4.0 3.0 3.0
4 1.0 3.0 4.0
5 4.0 4.0 3.0
6 4.0 1.0 4.0
7 NaN 4.0 3.0
8 NaN NaN 3.0
9 3.0 NaN 1.0