熊猫过滤器数据框用于正值和负值

我有3列的熊猫数据框,其中:

  • 类别dtype-字符串
  • 日期dtype-日期时间
  • 值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上查询过类似的查询(使用Pandas为每个过滤器标识一列中的最接近值如何找到Pandas系列中与输入数字最接近的值?

第一个使用idxmin,它返回第一次出现的值,而不是最接近的值。

第二个链接是关于特定值作为输入的-我不认为纯粹的方法np.argsort适用于我。

我可以想象使用一个复杂的if语句网络来执行此操作,但是,我不确定最有效的方法是使用熊猫。

任何指导将不胜感激。

斯科特·波士顿

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章