Pandas:根据条件填充NaN值

6

我正在处理一个看起来很琐碎但实际上并不简单的问题。总体情况是:data - 一个pandas数据帧 - 包含(除其他列外)TOTAL_VISITSNUM_PRINTS两列。

目标:给定num_prints参数,找到NUM_prints = num_prints的行,并用给定数字填充其中的nan值。

我停下来的地方并且它不再有意义了:

indices= data['NUM_PRINTS'] == num_prints

data.loc[indices,'TOTAL_VISITS'].fillna(5,inplace=True)

据我所知和了解,这应该是有效的。实践中没有将NaN填充为任何值,似乎使用副本或其他方式可以正常工作,因为它不会改变原始对象。

有效的内容:

data.loc[indices,'TOTAL_VISITS'] = 2

这会在num_print条件下将列填充为2,但不考虑NaN。

data['TOTAL_VISITS'].fillna(0, inplace=True)

这样做可以将总访问量中的NaN值填充为0,但不考虑num_prints条件。

使用常规的for循环和.iloc以及条件处理时间太长,我感到有些无助。

3个回答

3

我认为这个可以正常工作。

data['TOTAL_VISITS'] = np.where(data['NUM_PRINTS'] == 1, 100, data['TOTAL_VISITS'])

1
我认为np.where被严重低估了。 - Greg Williams

2
我认为需要在两侧进行过滤,并仅对已过滤的行应用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

1
嘿,感谢您的快速回复。 最好在更改之前打印(数据),以便我们可以确认其有效性,但无论如何,它对我来说都不起作用。 https://pastebin.com/X01VzBax 我已经对打印进行了评论。 - user9548409
@user9548409 - 有些问题,因为在使用fillna之后不可能再出现缺失值。您能否在应用解决方案之前和之后仅测试一列?print(data['TOTAL_VISITS'].isnull().sum()) - jezrael

0

一种不使用fillna的应用逻辑的方法是定义一个包含您条件的掩码。然后使用此掩码通过.loc更新系列。

下面的示例使用@jezrael的数据。

num_prints = 1

mask = (data['NUM_PRINTS'] == num_prints) & data['TOTAL_VISITS'].isnull()

data.loc[mask, 'TOTAL_VISITS'] = 100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接