我有一个这样的数据帧:
df = pd.DataFrame(np.random.randint(50, size=(4, 4),
index=[['a', 'a', 'b', 'b'], [800, 900, 800, 900]],
columns=['X', 'Y', 'r_value', 'z_value'])
df.index.names = ["dat", "recor"]
X Y r_value z_value
dat recor
a 800 14 28 12 18
900 47 34 59 49
b 800 33 18 24 33
900 18 25 44 19
...
我想应用一个函数来创建一个基于r_value的新列,该列只在recor==900的情况下提供值,所以,最后我想要这样的东西:
X Y r_value z_value BB
dat recor
a 800 14 28 12 18 NaN
900 47 34 59 49 0
b 800 33 18 24 33 NaN
900 18 25 44 19 2
...
我创建了这样的功能:
x = df.loc[pd.IndexSlice[:,900], "r_value"]
conditions = [x >=70, np.logical_and(x >= 40, x < 70),
np.logical_and(x >= 10, x < 40), x <10]
choices = [0, 1, 2, 3]
BB = np.select(conditions, choices)
因此,现在我需要将BB
附加为一列,用NaN填充与recor==800
对应的行。我该怎么做?我尝试了几个想法(这里没有评论(,但没有结果。Thx。
尝试
df.loc[df.index.get_level_values('recor')==900, 'BB'] = BB
部分df.index.get_level_values('recor')==900
创建一个True的布尔数组,其中索引级别"recor"
等于900
使用不存在的列进行索引,即"BB"
创建新列。
该列的其余部分应自动填充NaN
。
我不能测试它,因为你没有包括一个最小的可复制的例子。