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

时间:2019-01-20 19:45:26

标签: python python-3.x pandas

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

    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列表中。

唯一的问题是,它没有按预期运行,而是出现了以下错误:

  

ValueError:DataFrame的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

1 个答案:

答案 0 :(得分:1)

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

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.DataFrame,它不能用作索引。因此,错误数据会建议您根据您的任务使用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或仅选择一列即可。

修改
{<1}}是 all 元素的逻辑all(全部设置为and),而True所有元素的逻辑any em>所有元素(至少一个是or)。