1

目标:将一列添加到由标签组成的数据框中,如下所示:

(-10,5]=-2

(-5,0]= -1

[0,5)  = 0

[5,10)=  1

[10,15)= 2

....ETC

如果df.ptdelta介于两者之间(-10,5],则将 -2 添加到df.

尝试1:

df=pd.read_csv("___.csv",names="a b c d e f".split())
df.set_index(["a", "b"], inplace=True)
d=df["d"]<5 
u=df["d"]>=0

p=df["d"][d & u]

这似乎找不到任何实例:Series([], dtype=object)

df["d"]但在这个范围内确实有双打。

尝试2:

zero=[x for x in df["d"] if (0<=df["d"]) & (df["d"]<5)]

结果是:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

为什么其中任何一个都失败了?非常感谢。

df.head() gives: 

        price   ptdelta     II  pl
date    time                
date    time    price   ptdelta II  pl
1/5/2009    930     842     0   -   0
            1620    845.2   3.2     -   6.6
1/6/2009    930     851.8   6.6     -      -3.6
            1620    848.2   -3.6    -   -13
4

1 回答 1

0

您正在对数据进行分箱并按 bin 对其进行标记。很高兴,numpy.digitize可以为您做到这一点。

bins = [-10, -5, 0, 5, 10, 15]
labels = np.digitize(data, bins) - 3

例子:

In[1]: df = DataFrame({'d': np.random.randint(-20, 20, 100)})

In[2]: bins = [-10, -5, 0, 5, 10, 15]

In[3]: df['labels'] = np.digitize(df['d'], bins) - 3

In[4]: df.head()
Out[4]:
   d  labels
0 -8      -2
1  4       0
2 -7      -2
3 -3      -1
4  5       1

这些箱在左侧关闭,如 [-10, 5)。我认为您指定的垃圾箱不是自洽的。(我应该将 0 标记为 -1 还是 0?)无论如何,如果边缘情况至关重要,请参阅文档以获取更多选项。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

任何小于 -10 或大于 15 的数据点将分别标记为 -3 和 3。如果需要,您可以丢弃它们。

于 2013-03-15T20:00:10.847 回答