Pandas Dataframe:在过去的日期和值上有条件地添加列

时间:2013-09-21 02:30:30

标签: python numpy pandas

我正在继续努力完成大熊猫的事情。考虑一下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没有早于大于0.3的记录;并且只要ID具有值> gt的先前记录,就记录'已经'。 0.3。

所以输出看起来像:

   |  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

非常感谢任何意见。

1 个答案:

答案 0 :(得分:3)

这是一种方法,创建一个函数,作用于每个ID subDataFrame,返回一系列No,Yes和Already:

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