根据与混合类型列的数量比较设置值 - pandas

时间:2016-11-02 17:01:01

标签: python pandas

这应该是一个非常简单的一个,但我接近将我的头撞在墙上,因为我可以弄清楚如何做到这一点。任何帮助将不胜感激。

我有一个带有混合类型列的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或者是假。

非常感谢任何帮助。

此致

1 个答案:

答案 0 :(得分:2)

mask = df['Test'].map(lambda x: isinstance(x, (int, float)) and x < 0)
df.ix[mask, 'Test'] = 0