如何过滤熊猫系列?

时间:2018-10-31 13:00:34

标签: python pandas numpy series

我想过滤一个熊猫系列以删除某些值。这似乎是一个简单的任务,但对same question的首选答案对我而言不起作用。

这是我的可复制示例:

data = np.array([['','Col1','Col2'],
                ['Row1',1,2],
                ['Row2',3,4]])

myDF = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])

mySeries = myDF.loc[:, "Col1"]
mySeries[mySeries != 1]

我希望最后一行输出包含值3的单行,但我得到:

Row1    1
Row2    3
Name: Col1, dtype: object

我在做什么错了?

4 个答案:

答案 0 :(得分:2)

您的Series包含字符串。

>>> mySeries.tolist()
>>> ['1', '3']

您可以使用

>>> mySeries[mySeries != '1']
>>> 
Row2    3
Name: Col1, dtype: object

之所以会发生这种情况,是因为numpy数组具有单个数据类型,因此在创建data时将整数强制转换为字符串。

如果需要整数,可以使用

>>> mySeries = mySeries.astype(int)
>>> mySeries
>>> 
Row1    1
Row2    3
Name: Col1, dtype: int64

,您的原始代码就可以正常工作。

答案 1 :(得分:2)

考虑您要创建的NumPy数组的dtype:

data = np.array([['','Col1','Col2'],
                 ['Row1',1,2],
                 ['Row2',3,4]])

print(data)

array([['', 'Col1', 'Col2'],
       ['Row1', '1', '2'],
       ['Row2', '3', '4']], 
      dtype='<U4')

在馈送给np.array之前,将嵌套列表中的字符串和整数进行组合会创建一个字符串数组,以'<U4'表示,该字符串表示最大字符数。

如果您改用列表,则不会遇到此问题,因为该实现可确保使用适当的类型创建数组:

data = [['','Col1','Col2'],
        ['Row1',1,2],
        ['Row2',3,4]]

myDF = pd.DataFrame(data=[i[1:] for i in data[1:]],
                    index=[i[0] for i in data[1:]],
                    columns=data[0][1:])

答案 2 :(得分:1)

mySeries = mySeries.astype(int)
mySeries.loc[mySeries != 1]

答案 3 :(得分:1)

mySeries = pd.to_numeric(mySeries)

..它将解决