使用数据帧的列名列表,以创建新的列名列表,其中条件适用于值



我有以下列表,其中包含用于应用我的条件的列名:

    text_cols = df.select_dtypes(include=obj_types).columns.values.tolist()

然后,我使用以下列表 (text_cols) 来创建一个条件适用的新列表:

    if(df[df[text_cols] > 10]):
        cols_to_remove=df.columns.get_values()

因此,如您所见,我将列表作为 if 条件中的参数传递,然后检查数据帧中列表中的下一个列名的值是否优于 10,如果是这种情况,我获取当前列的值并将其添加到我的cols_to_remove列表中。

唯一的问题是,它没有按预期工作,而是收到以下错误:

错误:数据帧的真实值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

如果

df[colname]pd.Series,表达式df[df[colname] > 10]将起作用。在这种情况下,此表达式返回一个 bollean 索引:

df[colname] > 10
Out:
0  True
1  False
2  False
3  True

您可以使用此系列作为pd.DataFrame的索引:

df[df[column] > 10]

但是,例如,如果你有一个df,

In[8]: df = pd.DataFrame({'col1': [0,12,2], 'col2': [13, 11, 5]})
Out[8]: 
   col1  col2
0     0    13
1    12    11
2     2     5

如果你这样做

In [9]: df > 10                                                                 
Out[9]: 
    col1   col2
0  False   True
1   True   True
2  False  False

你会得到一个PD。数据帧,不能用作索引。因此,错误数据建议您根据任务使用all()any(),例如,

In [11]: (df > 10).all(axis=1)                                                  
Out[11]: 
0    False
1     True
2    False
dtype: bool

- 这是一维索引。因此,您可以通过以下方式对数据帧进行切片:

In [12]: df[(df > 10).all(axis=1)]                                              
Out[12]: 
   col1  col2
1    12    11
In [13]: df[(df > 10).any(axis=1)]                                              
Out[13]: 
   col1  col2
0     0    13
1    12    11

我想,它将解决您情况下的错误。只需使用正确的函数 - allany或只选择一列。

编辑
all所有元素(全部设置为 True)的逻辑andany所有元素的逻辑or(至少 True 个元素

)。

最新更新