簡體   English   中英

如何根據多個條件替換 NaN 值?

[英]How can I replace NaN values based on multiple conditions?

我在熊貓數據框中有 3 列。 它們是 A、B 和 C 列。

data = {"A": [10,12,30,21],
        "B": [12,24,16,31],
        "C": [1,None,None,4]}
df = pd.DataFrame(data, columns = ["A", "B", "C"])
print(df)

我想根據 B 列中的數據替換 C 列中的 NaN 值,這樣:

  • 如果 B 中的值在 10 到 20 之間,我想用 1 替換 C 列中的 NaN 值,
  • 如果 B 中的值在 20 到 30 之間,我想用 2 替換 C 列中的 NaN 值,
  • 如果 B 中的值介於 30 和 40 之間,我想用 3 替換 C 列中的 NaN 值,

這樣做的最有效方法是什么?

您可以使用字典創建replacement_value: index_mask映射,然后對其進行迭代,如下所示:

>>> masks = {1: (df['B'] >= 10) & (df['B'] < 20) & df['C'].isnull(), 2: (df['B'] >= 20) & (df['B'] < 30) & df['C'].isnull(), 3: (df['B'] >= 30) & df['C'].isnull()}
>>> masks
{1: 0    False
1    False
2     True
3    False
dtype: bool, 2: 0    False
1     True
2    False
3    False
dtype: bool, 3: 0    False
1    False
2    False
3    False
dtype: bool}
>>> for replacement_value, mask in masks.items():
...     df.loc[mask, 'C'] = replacement_value
... 
>>> df
    A   B    C
0  10  12  1.0
1  12  24  2.0
2  30  16  1.0
3  21  31  4.0

請注意,我將條件之間的上界排除在外,即用 1 替換df['B']需要在[10, 20)]范圍內; 替換為 2 [20, 30)等,因為否則你會有重疊的邊界。

我想你可以試試這個:

import numpy as np
df['C'].loc[(df['B']<=10) & (df['B']>=1) & (df['C'].isnull())]=1
df['C'].loc[(df['B']<=20) & (df['B']>=11) & (df['C'].isnull())]=2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM