我想过滤一个熊猫系列以删除某些值。这似乎是一个简单的任务,但对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
我在做什么错了?
答案 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)
..它将解决