我正在继续努力完成大熊猫的事情。考虑一下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
非常感谢任何意见。
答案 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