python – pandas:填写nans给出的条件

我正在努力寻找一些似乎微不足道的东西,但显然不是.一般情况:数据 – 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
点赞