Python 熊猫数据框:在过去的日期和值上有条件地添加列

Python 熊猫数据框:在过去的日期和值上有条件地添加列,python,numpy,pandas,Python,Numpy,Pandas,我将继续努力在熊猫中完成一些在excel中很容易完成的事情。考虑DF: | ID | Value | Date 0 | A | .21 | 2010-01-01 1 | A | .31 | 2010-02-01 2 | A | .44 | 2010-02-15 3 | B | .23 | 2010-01-01 4 | C | .21 | 2010-02-01 5 | C | .91

我将继续努力在熊猫中完成一些在excel中很容易完成的事情。考虑DF:

   |  ID  |  Value  |  Date
0  |  A   |  .21    |  2010-01-01
1  |  A   |  .31    |  2010-02-01
2  |  A   |  .44    |  2010-02-15
3  |  B   |  .23    |  2010-01-01
4  |  C   |  .21    |  2010-02-01
5  |  C   |  .91    |  2010-02-15
关于添加一个新列的最佳方法的想法,该列检查(a)值是否大于.30,以及(b)ID是否有一个日期早于.30的记录(行)

理想情况下,当值大于.3时,我希望在新列中记录“是”,这是该ID值大于.30的最早日期;记录“否”,其中值小于.3且ID没有大于.3的早期记录;只要ID有一个值>0.3的早期记录,就记录'ready'

因此,输出类似于:

   |  ID  |  Value  |  Date        | Result 
0  |  A   |  .21    |  2010-01-01  | No
1  |  A   |  .31    |  2010-02-01  | Yes
2  |  A   |  .24    |  2010-02-15  | Already
3  |  B   |  .23    |  2010-01-01  | No
4  |  C   |  .21    |  2010-02-01  | No
5  |  C   |  .91    |  2010-02-15  | Yes

非常感谢您的输入。

这里有一种方法,创建一个作用于每个ID子数据帧的函数,以返回一系列“否”、“是”和“已存在”:

In [11]: def f(x, threshold=0.3):
             first = (x > threshold).values.argmax()
             if x.iloc[first] > threshold:
                 return pd.concat([pd.Series('No', x.index[:first]),
                                   pd.Series('Yes', [x.index[first]]),
                                   pd.Series('Already', x.index[first+1:])])
             else:
                 return pd.Series('No', x.index)

In [12]: df.groupby('ID')['Value'].apply(f)
Out[12]:
0         No
1        Yes
2    Already
3        Yes
4         No
5        Yes
dtype: object

In [13]: df['Result'] = df.groupby('ID')['Value'].apply(f)

In [14]: df
Out[14]:
  ID  Value        Date   Result
0  A   0.21  2010-01-01       No
1  A   0.31  2010-02-01      Yes
2  A   0.29  2010-02-15  Already
3  B   0.23  2010-01-01      Yes
4  C   0.21  2010-02-01       No
5  C   0.91  2010-02-15      Yes

嗨,是的,我一直在努力修复它。问题是它会返回假阳性。即,在低于阈值的事件中给出“是”的结果。事实上,我在一个包含多个列的数据框中使用它,这有关系吗?我认为它只影响ID在数据集中只出现一次的情况,如果它只有一行,那么该行“首先”被索引。事实并非如此。我认为这可能和值列(float)的数据类型有关。但事实并非如此,因为在某些情况下,同一个值在一个id上正确地标记为“否”,然后在另一个id上正确地标记为“是”。“已经”功能运行得很好。@user1893148啊,好点,谢谢你的评论,将修复我的解决方案!我认为,如果有一种方法可以可靠地识别“第一个”索引,那么现有的方法将起作用。我在想,也许可以添加一列来区分阈值以上/以下的正确/错误,然后按id和t/f分组(然后去掉错误)。但是我无法在脑海中完全理解这个想法。所以问题是,如果argmax发现第0项都是假的,那么我只对其进行了特殊处理(我还使用了值,以便获得位置而不是标签)。