删除整列的行,使其符合列中的值

时间:2014-07-17 21:31:28

标签: python pandas

我遇到一个相当简单的命令问题。我有一个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仍然缺乏经验,并希望得到任何支持和建议!

1 个答案:

答案 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]不起作用。

如果您确实需要删除行,那么您需要考虑仅创建特定行的深拷贝数据帧。我必须深入研究文档才能弄明白这一点,因为大熊猫通过引用尝试做大多数事情是最好的,以避免复制大量的内存。