pandas dataframe中对象数据类型的布尔值

时间:2016-07-23 06:42:25

标签: python object numpy pandas

我将csv文件导入数据框。然后我想要消除其中一个系列中包含特定字符串的任何记录。例如:

import pandas as pd

df = pd.read_csv(filepath)
print df.head(3)

给出

    identity    quantity      fruit
0          1           3     apples
1          2           4    oranges
2          3           8     apples

然后我要删除任何包含苹果的记录。我的尝试主要围绕表达式

的变化
df = df[df.fruit != 'apples']

然而这会引发错误

TypeError: invalid type comparison

在检查数据类型时,我可以看到水果系列实际上存储为对象类型,显然不能直接与字符串进行比较

df.dtypes

id                       int64
identity               float64
quantity               float64
fruit                   object

我已经尝试了几种解决问题的方法,包括将数据导入为

df = pd.read_csv(filepath, dtype={'fruit':str})

删除了错误消息,但是当我使用布尔表达式时,删除我想要删除的记录实际上没有任何影响。

对此有任何解决方案或解决方法吗?

修改

检查类型

type(df.fruit)
<class 'pandas.core.series.Series'>

并将数据框打印为字典

print df.to_dict()
{'identity': {0: 1.0, 1: 2.0, 2: 3.0}, 'quantity': {0: 3.0, 1: 4.0, 2: 8.0}, 
'fruit': {0: 'apples', 1: 'oranges', 2: 'apples'}}

使用替代表达式

df = df[df['fruit'] != 'apples']

也会引发类型比较错误,而

df[df.fruit.astype('str') != 'apples']

不会引发任何错误,但也不会删除所需的记录。

我实际上找到了一个解决方案。如果我编写一个可以使用参数调用的函数&#34;删除&#34;

def CleanFruit(df, remove=None):
    df = df[df.fruit != remove]
    return df

df = CleanFruit(df, remove='apples')

这产生了预期的结果,但我不知道它为什么会起作用。

0 个答案:

没有答案