这应该是一个非常简单的一个,但我接近将我的头撞在墙上,因为我可以弄清楚如何做到这一点。任何帮助将不胜感激。
我有一个带有混合类型列的pandas DataFrame(它实际上是Decimal,float和string,但我们假设它是float和string)。我试图将所有小于0的浮点数的值设置为0.到目前为止我尝试过:
In [1]: import pandas as pd
In [2]: ex = [-1, 0, 'rabbit', 'carrots', 10, 24, 'dogs']
In [3]: df = pd.DataFrame(data = ex, columns=['Test'], index = range(len(ex)))
In [4]: Mask = df.loc[:,'Test'].apply(type) != str
In [5]: df.loc[Mask,:] < 0
Out[5]: Test
0 True
1 False
4 False
5 False
好的很好,但是现在我需要将它传递给.ix
以实际设置-1值,为零,这就是事情变得困难的地方(这也是完全可以理解的,因为index与原始索引的大小不同)
In [6]: df.ix[df.loc[Mask,'Test'] < 0,'Test'] = 0
Out[6]: [...] IndexingError: Unalignable boolean Series key provided
这当然完全可以理解,但我不知道如何解决这个问题。
我尝试.index.tolist()
创建第二个掩码来获取我应该操作的索引值,但这只返回df.loc[Mask,'Test'] < 0
比较的所有索引,无论它们是否为True或者是假。
非常感谢任何帮助。
此致
添
答案 0 :(得分:2)
mask = df['Test'].map(lambda x: isinstance(x, (int, float)) and x < 0)
df.ix[mask, 'Test'] = 0