我有一个3列的熊猫数据框,其中:
值dtype-浮点数
df = pd.DataFrame()
df['category'] = ['a', 'b', 'b', 'b', 'c', 'a', 'b', 'c', 'c', 'a']
df['date'] = ['2018-01-01', '2018-01-01', '2018-01-03', '2018-01-05', '2018-01-01', '2018-01-02', '2018-01-06', '2018-01-03', '2018-01-04','2018-01-01']
df['values'] = [1, 2, -1.5, 2.3, 5, -0.7, -5.2, -5.2, 1, -1.1]
df
我想过滤出每个类别中接近该日期的正值和负值(差异最小)的行。
因此,从本质上来说,输出看起来像:
df = pd.DataFrame()
df['category'] = ['a', 'a','b', 'b', 'c', 'c']
df['date'] = ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-03', '2018-01-01', '2018-01-03']
df['values'] = [1, -1.1, 2, -1.5, 5, -5.2]
df
我看过类似的关于SO(Identifying closest value in a column for each filter using Pandas,How do I find the closest values in a Pandas series to an input number?)的查询
第一个使用idxmin
,它返回第一个出现的值,而不是最接近的值。
第二个链接是关于特定值作为输入的-我不认为单纯的np.argsort
可以工作。
我可以想象使用复杂的if语句网络来执行此操作,但是,我不确定用pandas来执行此操作最有效的方法是什么。
任何指导将不胜感激。
答案 0 :(得分:0)
IIUC,首先对您的数据框进行排序,然后使用idxmin
:
df1 = df.sort_values(['category','date'])
df1[df1.groupby('category')['values']\
.transform(lambda x: x.index.isin([x.ge(0).idxmin(), x.lt(0).idxmin()]))]
输出:
category date values
0 a 2018-01-01 1.0
9 a 2018-01-01 -1.1
1 b 2018-01-01 2.0
2 b 2018-01-03 -1.5
4 c 2018-01-01 5.0
7 c 2018-01-03 -5.2