首页 > 解决方案 > 根据已知行标签而不是值从数据框中删除行

问题描述

我有一个数据框,它是 LinearRegression() 调用的输出,如下所示:

coeff_df = 
             Coefficient
pm  0.8297072586069981
sen 0.8199381072144118
tem 0.7483758123794492
no  0.2825715519743024
s_ref   -0.4376018493604922
ref -0.02338361622015777

我想删除我认为不重要的系数,例如:

coeff_df_abs = abs(coeff_df)
highestcoeff = coeff_df_abs.max()
lowestcoeff = coeff_df_abs.min()
if highestcoeff[0] / lowestcoeff[0] > 10
   #delete lowestcoeff from coeff_df

我可以获得一个具有 nans 的新数据帧(或 .dropnans 仅用于 1x1 数据帧)

new_coeffs = coeff_df[coeff_df_abs==coeff_df_abs.min()]
#output
    Coefficient
pm25    
sen 
tem 
no  
s_ref   
ref -0.023383616220157777

然后如何从原始数据帧 coeff_df 中删除 new_coeffs 中的一个非 nan 单元格?

请注意,我无法利用数据框单元格的值,因为我实际上是在测试接近 0 而不是 > 或 < 0 并且我不知道哪些单元格是负数或正数。

谢谢!

编辑:我要补充说的是,实际意图是仅使用通过我的测试的系数来调用新的线性回归,所以如果我能得到一些可以变成列表以传递回我的 X,y 的东西,则可以加分数据框,例如。

possible_Xvars = ['pm','sen','tem']
X = dataset[possible_xvars].values  #this already works in my code, just for clarity of ultimate goal

标签: pythonpandas

解决方案


然后如何从原始数据帧 coeff_df 中删除 new_coeffs 中的一个非 nan 单元格?

假设第一列是您的索引,您可以简单地使用

coeff_df.drop(new_coeffs.index)

这相当于

coeff_df.drop(labels=new_coeffs.index, axis='index')

其中labels是标签名称或此类名称的列表,并axis定义指定标签是出现在索引(行)还是数据框的列中。另见:https ://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html

一般来说,使用 index 属性也可能是您问题第二部分的答案。该index.tolist()方法生成一个包含数据框中所有现有标签名称的列表。所以,你正在寻找的应该是:

possible_Xvars = new_coeffs.index.tolist()

推荐阅读