如何在屏蔽数据后避免由 python 使用 UserWarning 完成的隐式修复

Posted

技术标签:

【中文标题】如何在屏蔽数据后避免由 python 使用 UserWarning 完成的隐式修复【英文标题】:How to avoid Implicit fix done by python with UserWarning after Masking Data 【发布时间】:2019-05-20 06:30:23 【问题描述】:

当我用另一组数据屏蔽我的数据集时,它会显示一个 UserWarning:布尔系列键将被重新索引以匹配 DataFrame 索引。我将如何避免这种情况? Python 会自动重新索引它,但该列的标题是空白的,我似乎无法重命名它,所以我可以在我的代码中引用该列。我也不想依赖这种隐含的修正。

我尝试通过 pd.DataFrame.columns() 或 pd.DataFrame.rename() 两种方式手动重命名列。出于某种原因,我得到一个错误,即它需要 3 个元素而不是 4 个元素,或者添加的空列索引不会被重命名。

# select data and filter it which results in the error which fixes the dataframe but leaves the column name empty

stickData = data[['Time','Pitch Stick Position(IN)','Roll Stick Position (IN)']]
filteredData = stickData[contactData['CONTACT'] == 1]

# moving forward from the error I tried using rename which does not error but also does nothing
filteredData.rename(index=0:'Index')

# I also tried this
filteredData.rename(index='':'Old_Index')

# I even went and tried to add the names of the dataframe like so which resulted in ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
filteredData.columns = ['Old_Index','Time','Pitch Stick Position(IN)','Roll Stick Position (IN)']

filteredData.head()的当前dataframe在python隐式修正后是这样的:

Index              Time          Pitch Stick Position(IN)  Roll Stick Position (IN)
0       1421  240:19:06:40.200                  0.007263                 -0.028500
1       1422  240:19:06:40.400                  0.022327                  0.139893
2       1423  240:19:06:40.600                 -0.016409                  0.540756
3       1424  240:19:06:40.800                 -0.199329                  0.279971
4       1425  240:19:06:41.000                  0.013719                 -0.018069

但我想在不依赖隐式更正的情况下显示带有 Old_index 标记的更多内容:

Index   Old_index   Time          Pitch Stick Position(IN)  Roll Stick Position (IN)
1       1421  240:19:06:40.200                  0.007263                 -0.028500
2       1422  240:19:06:40.400                  0.022327                  0.139893
3       1423  240:19:06:40.600                 -0.016409                  0.540756
4       1424  240:19:06:40.800                 -0.199329                  0.279971
5       1425  240:19:06:41.000                  0.013719                 -0.018069

【问题讨论】:

【参考方案1】:

您的代码中有一些错误:

    不要使用chained indexing。请改用 loc / iloc 访问器。 Assign back to variables 使用未就地操作的方法时。 一般情况下,不要使用派生自其他数据帧的布尔索引器。如果可以保证行对齐,则通过pd.Series.values 提取 NumPy 数组表示。

例如,假设contactData 中的行与filteredData 中的行对齐,这将起作用

cols = ['Time','Pitch Stick Position(IN)','Roll Stick Position (IN)']

filteredData = data.loc[(contactData['CONTACT'] == 1).values, cols]\
                   .rename(index=0:'Index')

请注意,我们可以链接诸如locrename之类的方法,而不是每次都显式分配回filteredData

【讨论】:

【参考方案2】:

你能试试吗:

filteredData = stickData[contactData['CONTACT'] == 1].reset_index().rename(columns='index': 'Old_index') 

或者把这块放在某个地方,我没有你的样本数据,我无法测试它

.reset_index().rename(columns='index': 'Old_index')

【讨论】:

以上是关于如何在屏蔽数据后避免由 python 使用 UserWarning 完成的隐式修复的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Webpack 上避免重复的 sass 导入(使用 @use)

python 如何把一段语句屏蔽,但是又不删除

如何在设置记录数据时屏蔽 Extjs 网格并在设置后取消屏蔽?

html中如何使用python屏蔽一些基本功能

如何开通被电信屏蔽的80端口

怎样彻底屏蔽系统更新