我有以下列表,其中包含用于在其上应用条件的列名:
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()。
答案 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
我想,它将解决您的情况下的错误。只需使用正确的功能-all
,any
或仅选择一列即可。
修改
{<1}}是 all 元素的逻辑all
(全部设置为and
),而True
是所有元素的逻辑any
em>所有元素(至少一个是or
)。