Pands赋值的一点小知识
🔊

Pands赋值的一点小知识

Property
notion image
好久没有写知识记录了,之前几个月一直在忙着实习和毕业论文的事情。今天偶尔遇到了一个问题,想要记录下来。
起因是这样的:我需要计算 NN 模型中,每一个特征的因子重要性,主要的方法是通过shuffle特征,然后重复预测,看预测结果的loss表现。显然,loss越大,说明特征越重要。

1. debug 过程

在这个计算过程中,涉及一个列数据shuffle操作,我最开始的做法是这样的:
np.random.seed(2023)
data[feature] = np.random.shuffle(data[feature].values)
然后我发现shuffle之后的列数据存在NoneType数据,导致报错。然而在shuffle之前,我已经对缺失值进行了处理。因此,我怀疑是不是numpy的函数有些问题。遂改为下面的代码:
import random
random.seed(2023)
data[feature] = random.shuffle(data[feature].values.tolist())
结果发现还是有缺失值。。。
在同事的提醒下,或许可以使用df.sample来shuffle(之前不用是因为以为只能对整个df进行sample):
data[feature] = data[feature].sample(frac=1)
发现这回没有了缺失值,但是shuffle失败了,怀疑是不是因为index对应关系问题,发现pd.Series().sample()中有ignore_index的参数,因此:
data[feature] = data[feature].sample(frac=1, ignore_index=True)
结果发现,报错没有该参数。。。至此,我已经有点难受了,毕竟直接使用pd.Series().sample()是可以实现shuffle操作的。最后我想着,不如转换成numpy array:
data[feature] = data[feature].sample(frac=1, ignore_index=True).values
结果成功!
 

2. 复盘

之所以一开始不用 sample ,是因为我一直以为只能对 DataFrame 做这个操作,没有想过Series也支持这个操作。
其次,在使用 numpy / random 两个库的时候,都在赋值的时候去掉了index,没有及时想到index的问题。(其实到现在也不清楚为啥那两个操作不成功)
最后,在使用 df.sample 的时候,忘了将 index 去掉。