数据框操作
目标:在一个数据表中添加一列标签,具体如下:
(-10,5]=-2
(-5,0]= -1
[0,5) = 0
[5,10)= 1
[10,15)= 2
....等等
如果 df.ptdelta
的值在 (-10,5]
这个范围内,就在 df
的一列中加上 -2。
尝试 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
1 个回答
0
你正在把数据分成不同的区间,并给这些区间贴上标签。幸运的是,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,你可以根据需要将它们丢弃。