我遇到一个相当简单的命令问题。我有一个DataFrame,并希望删除相应的行,如果column1(在此行中)的值超过例如5。
第一步,if条件:
if df['column1]>5:
使用此命令,我总是会收到以下值错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
你知道这可能是什么意思吗?
第二步(下拉行):
如何指定Python将删除整行?我是否必须使用循环或有一个简单的解决方案,如df.drop(df.index [?])。
我对Python仍然缺乏经验,并希望得到任何支持和建议!
答案 0 :(得分:2)
你得到错误的原因是因为df['column1'] > 5
返回一系列布尔值,长度与column1相等,而且系列不能为真或假,即“系列的真值”是模棱两可的“。
那就是说,如果你只需要选择满足特定条件的行,那么你可以使用返回的系列作为布尔索引,例如
>>> from numpy.random import randn
>>> from pandas import DataFrame
#Create a data frame of 10 rows by 5 cols
>>> D = DataFrame(randn(10,5))
>>> D
0 1 2 3 4
0 0.686901 1.714871 0.809863 -1.162436 1.757198
1 -0.071436 -0.898714 0.062620 1.443304 -0.784341
2 0.597807 -0.705585 -0.019233 -0.552494 -1.881875
3 1.313344 -1.146257 1.189182 0.169836 -0.186611
4 0.081255 -0.168989 1.181580 0.366820 2.999468
5 -0.221144 1.222413 1.199573 0.988437 0.378026
6 1.481952 -2.143201 -0.747700 -0.597314 0.428769
7 0.006805 0.876228 0.884723 -0.899379 -0.270513
8 -0.222297 1.695049 0.638627 -1.500652 -1.088818
9 -0.646145 -0.188199 -1.363282 -1.386130 1.065585
#Making a comparison test against a whole column yields a boolean series
>>> D[2] >= 0
0 True
1 True
2 False
3 True
4 True
5 True
6 False
7 True
8 True
9 False
Name: 2, dtype: bool
#Which can be used directly to select rows, like so
>>> D[D[2] >=0]
#note rows 2, 6 and 9 re now missing.
0 1 2 3 4
0 0.686901 1.714871 0.809863 -1.162436 1.757198
1 -0.071436 -0.898714 0.062620 1.443304 -0.784341
3 1.313344 -1.146257 1.189182 0.169836 -0.186611
4 0.081255 -0.168989 1.181580 0.366820 2.999468
5 -0.221144 1.222413 1.199573 0.988437 0.378026
7 0.006805 0.876228 0.884723 -0.899379 -0.270513
8 -0.222297 1.695049 0.638627 -1.500652 -1.088818
#if you want, you can make a new data frame out of the result
>>> N = D[D[2] >= 0]
>>> N
0 1 2 3 4
0 0.686901 1.714871 0.809863 -1.162436 1.757198
1 -0.071436 -0.898714 0.062620 1.443304 -0.784341
3 1.313344 -1.146257 1.189182 0.169836 -0.186611
4 0.081255 -0.168989 1.181580 0.366820 2.999468
5 -0.221144 1.222413 1.199573 0.988437 0.378026
7 0.006805 0.876228 0.884723 -0.899379 -0.270513
8 -0.222297 1.695049 0.638627 -1.500652 -1.088818
有关详情,请参阅the Pandas docs on boolean indexing;请注意,文档中使用的列选择的点语法仅适用于非数字列名称,因此在上面的示例中D[D.2 >= 0]
不起作用。
如果您确实需要删除行,那么您需要考虑仅创建特定行的深拷贝数据帧。我必须深入研究文档才能弄明白这一点,因为大熊猫通过引用尝试做大多数事情是最好的,以避免复制大量的内存。