我希望使用pandas
根据列名(包含空格)和单元格值删除行。我已经尝试了各种方法来实现这一点(drop和query方法),但由于名称中的空格,我似乎失败了。有没有办法使用其中有空格的名称查询数据,或者我是否需要先清理所有空格?
以csv文件形式提供的数据
Date,"price","Sale Item"
2012-06-11,1600.20,item1
2012-06-12,1610.02,item2
2012-06-13,1618.07,item3
2012-06-14,1624.40,item4
2012-06-15,1626.15,item5
2012-06-16,1626.15,item6
2012-06-17,1626.15,item7
尝试示例
df.drop(['Sale Item'] != 'Item1')
df.drop('Sale Item' != 'Item1')
df.drop("'Sale Item'] != 'Item1'")
df.query('Sale Item' != 'Item1')
df.query(['Sale Item'] != 'Item1')
df.query("'Sale Item'] != 'Item1'")
在大多数情况下收到错误
ImportError: 'numexpr' not found. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed
答案 0 :(得分:8)
如果我正确理解了您的问题,也许您只需应用以下过滤器:
df = df[df['Sale Item'] != 'item1']
返回:
Date price Sale Item
1 2012-06-12 1610.02 item2
2 2012-06-13 1618.07 item3
3 2012-06-14 1624.40 item4
4 2012-06-15 1626.15 item5
5 2012-06-16 1626.15 item6
6 2012-06-17 1626.15 item7
答案 1 :(得分:4)
DataFrame.drop(标签,轴= 0,级别=无,inplace = False,错误='提升')
返回新对象,并删除请求轴中的标签
DataFrame.drop()
会删除index
行,而不是条件。因此,你很可能需要像 -
df.drop(df.ix[df['Sale Item'] != 'item1'].index)
请注意,这会丢弃符合条件的行,因此结果将是不符合条件的行,如果您想要相反,则可以在条件之前使用~
运算符否定它。
但这看起来有点过分,只需使用布尔索引来获取所需的行就更容易了(如另一个答案中所示)。
演示 -
In [20]: df
Out[20]:
Date price Sale Item
0 2012-06-11 1600.20 item1
1 2012-06-12 1610.02 item2
2 2012-06-13 1618.07 item3
3 2012-06-14 1624.40 item4
4 2012-06-15 1626.15 item5
5 2012-06-16 1626.15 item6
6 2012-06-17 1626.15 item7
In [21]: df.drop(df.ix[df['Sale Item'] != 'item1'].index)
Out[21]:
Date price Sale Item
0 2012-06-11 1600.2 item1