数据框操作

1 投票
1 回答
917 浏览
提问于 2025-04-17 19:15

目标:在一个数据表中添加一列标签,具体如下:

(-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,你可以根据需要将它们丢弃。

撰写回答